首先SOA和微服务架构一个层面的东西,而对于ESB和微服务网关是一个层面的东西,一个谈到是架构风格和方法,一个谈的是实现工具或组件。
SOA(Service Oriented Architecture)“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。
微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。
微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想
系统集成:站在系统的角度,解决企业系统间的通信问 题,把原先散乱、无规划的系统间的网状结构,梳理成 规整、可治理的系统间星形结构,这一步往往需要引入 一些产品,比如 ESB、以及技术规范、服务管理规范; 这一步解决的核心问题是【有序】
系统的服务化:站在功能的角度,把业务逻辑抽象成 可复用、可组装的服务,通过服务的编排实现业务的 快速再生,目的:把原先固有的业务功能转变为通用 的业务服务,实现业务逻辑的快速复用;这一步解决
本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。
为了防止不提供原网址的转载,特在这里加上原文链接:
https://www.cnblogs.com/skabyy/p/11396571.html
要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。从单体应用到微服务并不是一蹴而就的,这是一个逐渐演变的过程。本文将以一个网上超市应用为例来说明这一过程。
几年前,小明和小皮一起创业做网上超市。小明负责程序开发,小皮负责其他事宜。当时互联网还不发达,网上超市还是蓝海。只要功能实现了就能随便赚钱。所以他们的需求很简单,只需要一个网站挂在公网,用户能够在这个网站上浏览商品、购买商品;另外还需一个管理后台,可以管理商品、用户、以及订单数据。
我们整理一下功能清单:
小明挥一挥手,找了家云服务部署上去,网站就上线了。上线后好评如潮,深受各类肥宅喜爱。小明小皮美滋滋地开始躺着收钱。
好景不长,没过几天,各类网上超市紧跟着拔地而起,对小明小皮造成了强烈的冲击。
在竞争的压力下,小明小皮决定开展一些营销手段:
这些活动都需要程序开发的支持。小明拉了同学小红加入团队。小红负责数据分析以及移动端相关开发。小明负责促销活动相关功能的开发。
因为开发任务比较紧迫,小明小红没有好好规划整个系统的架构,随便拍了拍脑袋,决定把促销管理和数据分析放在管理后台里,微信和移动端
在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。
微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。
在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。
单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,它暴露出来的问题也越来越多,主要有以下几点:
复杂性逐渐变高
比如有的项目有几十万行代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题。
技术债务逐渐上升
公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多。
部署速度逐渐变慢
这个就很
问题描述:
创建一个内部网络(docker network create ims_network),在这个内部网络跑了两个容器(一个mysql容器,一个python容器),从python容器中向mysql容器中写数据(insert,update)很慢,select很快。
时间:10个insert用了2秒。
问题解决:
[mysqld]
skip-name-resolve
innodb_flush_log_at_trx_commit=0
sync_binlog=0
方法解析:
————————————————
版权声明:本文为CSDN博主「纯真-Cloud」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chunzhenzyd/article/details/82887269
docker ps
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)
docker-machine ssh default
docker search httpd
docker images
docker-php-ext-install pdo pdo_mysql
docker run -d -p 5000:5000 training/webapp python app.py
查看日志:docker logs --tail 3000 e0864b9d33ef
查找IP
docker-machine ip default
docker inspect 容器名称
docker run -itd -p 9001:9001 -v /PHP:/www --name php74 /bin/bash php:7.4-fpm
docker run -p 3307:3306 --name mysql -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:5.7
docker run -p 6379:6379 --name redis -v /Docker/redis/redis.conf:/etc/redis/redis.conf -v /Docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
docker exec -it redis /bin/bash
docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2
docker run
pull php 镜像
docker pull php:7.3-alpine3.8
创建容器
docker run -it --name test php:7.3-alpine3.8 sh
# 安装依赖的第三方包
echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
apk --no-cache add autoconf gcc g++ make openssl openssl-dev
#下载swoole
pecl install swoole-4.3.1
#开启扩展
docker-php-ext-enable swoole
#查看扩展
php -m
#将目前环境打包成新镜像
docker commit test swoole:4.3.1
docker run -it --name swoole \
-p 80:80 \
-v /home/my/lujing:/pro \
swoole:4.3.1 sh
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
执行composer dump-autoload映射app目录
$http = new Swoole\Http\Server("0.0.0.0", 80);
$http->on('request', function ($request,Swoole\Http\Response $response) {
$response->end("<h1>hello</h1>");
});
$http->start();
RabbitMQ是一个消息代理器:它接受和转发消息。你可以把它当作一个邮局:当你把邮件放在信箱里时,你可以肯定邮差先生最终会把邮件送到你的收件人那里。在这个比喻中,RabbitMQ就是这里的邮箱,邮局和邮差。
RabbitMQ和邮局之间的主要区别是,它不处理纸张,而是接受、存储和转发二进制数据‒消息。
RabbitMQ,和一般的消息传递,使用专业术语。
生产者的工作就是发送消息。发送消息的程序是生产者:
队列类比一个邮箱,存在于RabbitMQ, 然而信息流通过RabbitMQ和您的应用程序,他们只能存储在一个队列。队列只受主机内存和磁盘限制的约束,它本质上是一个很大的消息缓冲区。会有许多生产者可以发送到一个队列的消息,许多消费者可以尝试从一个队列接收数据。这就是我们如何表示队列的方式:
消费者和生产者有着相似的意义. 消费者无非就是等待消息然后处理的程序:
请注意,生产者、消费者和代理不必同一主机上;事实上,在大多数应用程序中它们没有这样做。
(使用PHP amqplib客户端)
在本教程的这一部分中,我们将用PHP编写两个程序;一个生产者发送一条消息,一个用户接收消息并将它们打印出来。我们会PHP amqplib API的忽略一些细节,集中在这个非常简单的事情刚刚开始。这是一个“Hello World”的消息传递。
在下图中,“p”是我们的生产商,“C”是我们的消费者。在中间的框是一个队列的消息缓冲区,RabbitMQ保持代表的消费。
RabbitMQ有很多协议。本教程介绍AMQP 0-9-1,这是一个开放的、通用的协议消息。有许多不同的语言RabbitMQ一批客户。我们将在本教程中使用PHP amqplib,composer解决依赖管理。
添加composer.json:
{
"require": {
"php-amqplib/php-amqplib": ">=2.6.1"
}
}
composer install
# 或者 直接运行包引入
composer require php-amqpli
本教程适合 Mac 及 linux 用户的二进制版安装。
Mac, Linux 用户的源码版安装,参见这里。
Windows 用户的二进制版安装,参见这里。
Windows 用户的源码版安装,参见这里。
安装步骤:
下载 leanote 二进制版。
安装 mongodb。
导入初始数据。
配置 leanote。
运行 leanote。
由此处下载 leanote 最新二进制版。
假设将文件下载到 /home/user1 目录下, 解压文件从而在 /home/user1 目录下生成 leanote目录:
$> cd /home/user1
$> tar -xzvf leanote-darwin-amd64.v2.0.bin.tar.gz
到 mongodb 官网 下载相应系统的最新版安装包,或者从以下链接下载旧版本:
64位 linux mongodb 3.0.1 下载链接: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.1.tgz
下载到 /home/user1
下, 直接解压即可:
$> tar -xzvf mongodb-linux-x86_64-3.0.1.tgz/
$> mv mongodb-linux-x86_64-3.0.6/ /home/mongodb # 将解压包拷贝到指定目录
$> mkdir -p /data/db # 创建数据库目录
为了快速使用mongodb命令, 可以配置环境变量。编辑 ~/.profile
或/etc/profile
文件, 将mongodb/bin路径加入即可:
$> sudo vim /etc/profile
此处实例使用了vim文本编辑器,你可以使用自己熟悉的编辑器。
在/etc/profile中添加以下行,注意把用户名(u
1.查找
db.system.users.find().pretty()
show users
db.table.find()
db.table.find().pretty()
db.col.getIndexes()
db.col.totalIndexSize()
db.col.dropIndexes()
db.col.dropIndex("索引名称")
// LIKE模糊查询userName包含A字母的数据(%A%)
// SQL:SELECT * FROM UserInfo WHERE userName LIKE "%A%"
db.UserInfo.find({userName :/A/})
// LIKE模糊查询userName以字母A开头的数据(A%)。
// SQL:SELECT * FROM UserInfo WHERE userName LIKE "A%"
db.UserInfo.find({userName :/^A/})
//查询商品名称长度大于25个字符的商品
db.item.find({item_name:{$exists:true},$where:"(this.item_name.length > 25)"}).limit(5)
db.item.find({"item_name": {"$exists": true, "$regex": /^.{25,}$/}}).limit(5)
//查询商品名称长度小于5个字符的商品
db.item.find({$where:"this.item_name.length < 5"}).limit(5)
db.item.find({"item_name": {"$regex": /^.{0,5}$/}}).limit(5)
2.创建
MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录
mongod 参数:--bind_ip
默认值是所有的IP地址都能访问,该参数指定MongoDB对外提供服务的绑定IP地址,用于监听客户端 Application的连接,客户端只能使用绑定的IP地址才能访问mongod,其他IP地址是无法访问的。
mongod 参数:--port
MongoDB 默认监听的端口是27017,该参数显式指定MongoDB实例监听的TCP 端口,只有当客户端Application连接的端口和MongoDB实例监听的端口一致时,才能连接到MongoDB实例。
mongod 参数:--auth
默认值是不需要验证,即 --noauth,该参数启用用户访问权限控制;当mongod 使用该参数启动时,MongoDB会验证客户端连接的账户和密码,以确定其是否有访问的权限。如果认证不通过,那么客户端不能访问MongoDB的数据库。
Enables authorization to control user’s access to database resources and operations. When authorization is enabled, MongoDB requires all clients to authenticate themselves first in order to determine the access for the client.
mongo 参数:--username <username>, -u <username>
mongo 参数:--password <password>, -p <password>
mongo 参数:--authenticationDatabase <dbname>
mongo -u workerman_rw -p DQP5cK7! --authenticationDatabase