微服务    2021-12-16 18:52:14    3    0    0

1.SOA架构和微服务架构的区别

首先SOA和微服务架构一个层面的东西,而对于ESB和微服务网关是一个层面的东西,一个谈到是架构风格和方法,一个谈的是实现工具或组件。

  1. SOA(Service Oriented Architecture)“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。

  2. 微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。

    微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想

2.ESB和微服务API网关。

  1. ESB(企业服务总线),简单 来说 ESB 就是一根管道,用来连接各个服务节点。为了集 成不同系统,不同协议的服务,ESB 做了消息的转化解释和路由工作,让不同的服务互联互通;
  2. API网关:API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。

3.SOA架构特点:

系统集成:站在系统的角度,解决企业系统间的通信问 题,把原先散乱、无规划的系统间的网状结构,梳理成 规整、可治理的系统间星形结构,这一步往往需要引入 一些产品,比如 ESB、以及技术规范、服务管理规范; 这一步解决的核心问题是【有序】

系统的服务化:站在功能的角度,把业务逻辑抽象成 可复用、可组装的服务,通过服务的编排实现业务的 快速再生,目的:把原先固有的业务功能转变为通用 的业务服务,实现业务逻辑的快速复用;这一步解决

微服务    2021-12-16 18:38:53    6    0    0

本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。

为了防止不提供原网址的转载,特在这里加上原文链接:
https://www.cnblogs.com/skabyy/p/11396571.html

要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。从单体应用到微服务并不是一蹴而就的,这是一个逐渐演变的过程。本文将以一个网上超市应用为例来说明这一过程。

最初的需求

几年前,小明和小皮一起创业做网上超市。小明负责程序开发,小皮负责其他事宜。当时互联网还不发达,网上超市还是蓝海。只要功能实现了就能随便赚钱。所以他们的需求很简单,只需要一个网站挂在公网,用户能够在这个网站上浏览商品、购买商品;另外还需一个管理后台,可以管理商品、用户、以及订单数据。

我们整理一下功能清单:

  • 网站
    • 用户注册、登录功能
    • 商品展示
    • 下单
  • 管理后台
    • 用户管理
    • 商品管理
    • 订单管理
      由于需求简单,小明左手右手一个慢动作,网站就做好了。管理后台出于安全考虑,不和网站做在一起,小明右手左手慢动作重播,管理网站也做好了。总体架构图如下:

title

小明挥一挥手,找了家云服务部署上去,网站就上线了。上线后好评如潮,深受各类肥宅喜爱。小明小皮美滋滋地开始躺着收钱。

随着业务发展……

好景不长,没过几天,各类网上超市紧跟着拔地而起,对小明小皮造成了强烈的冲击。

在竞争的压力下,小明小皮决定开展一些营销手段:

  • 开展促销活动。比如元旦全场打折,春节买二送一,情人节狗粮优惠券等等。
  • 拓展渠道,新增移动端营销。除了网站外,还需要开发移动端APP,微信小程序等。
  • 精准营销。利用历史数据对用户进行分析,提供个性化服务。
  • ……

这些活动都需要程序开发的支持。小明拉了同学小红加入团队。小红负责数据分析以及移动端相关开发。小明负责促销活动相关功能的开发。

因为开发任务比较紧迫,小明小红没有好好规划整个系统的架构,随便拍了拍脑袋,决定把促销管理和数据分析放在管理后台里,微信和移动端

微服务    2021-12-16 18:18:39    7    0    0

一、微服务介绍

1. 什么是微服务

在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。

2. 微服务由来

微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

3. 为什么需要微服务?

在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。

3.1 最期的单体架构带来的问题

单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,它暴露出来的问题也越来越多,主要有以下几点:

  1. 复杂性逐渐变高
    比如有的项目有几十万行代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题。

  2. 技术债务逐渐上升
    公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多。

  3. 部署速度逐渐变慢
    这个就很

Docker Mysql    2021-12-13 13:06:26    5    0    0

问题描述:

创建一个内部网络(docker network create ims_network),在这个内部网络跑了两个容器(一个mysql容器,一个python容器),从python容器中向mysql容器中写数据(insert,update)很慢,select很快。

时间:10个insert用了2秒。

问题解决:

  1. [mysqld]
  2. skip-name-resolve
  3. innodb_flush_log_at_trx_commit=0
  4. sync_binlog=0

方法解析:

skip-name-resolve
跳过域名解析,对有些场景很管用,但对我遇到的不怎么管用。
设置这个以后,速度只有一点点提升(2秒 -> 1秒9)。
innodb_flush_log_at_trx_commit=0
这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。
设置这个以后,速度有很大提升(1秒9 -> 1秒)。
sync_binlog=0
每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。设为1是最安全的做法,但效率最低。docker中默认设置是1,意思是由操作系统来负责二进制日志文件的同步工作。
设置这个以后,速度有显著提升(1秒 -> 30毫秒)。

————————————————
版权声明:本文为CSDN博主「纯真-Cloud」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chunzhenzyd/article/details/82887269

Docker    2021-12-12 16:19:03    3    0    0
  • 查看运行容器:docker ps
  • 停止所有容器:docker stop $(docker ps -a -q)
  • 删除所有容器:docker rm $(docker ps -a -q)
  • 删除所有镜像:docker rmi $(docker images -q)
  • 进入docker: 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

  1. docker-machine ip default
  2. docker inspect 容器名称
  • php7.4
  1. docker run -itd -p 9001:9001 -v /PHP:/www --name php74 /bin/bash php:7.4-fpm
  • mysql
  1. docker run -p 3307:3306 --name mysql -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:5.7
  • redis
  1. 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
  2. docker exec -it redis /bin/bash
  • mongodb
  1. docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2
  • hyperf
  1. docker run
swoole Docker    2021-12-12 10:49:52    7    0    0

1.下载镜像

pull php 镜像

  1. docker pull php:7.3-alpine3.8

创建容器

  1. docker run -it --name test php:7.3-alpine3.8 sh

2.进入容器安装swoole

  1. # 安装依赖的第三方包
  2. echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
  3. echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
  4. apk --no-cache add autoconf gcc g++ make openssl openssl-dev
  5. #下载swoole
  6. pecl install swoole-4.3.1
  7. #开启扩展
  8. docker-php-ext-enable swoole
  9. #查看扩展
  10. php -m
  11. #将目前环境打包成新镜像
  12. docker commit test swoole:4.3.1

3.创建swoole容器

  1. docker run -it --name swoole \
  2. -p 80:80 \
  3. -v /home/my/lujing:/pro \
  4. swoole:4.3.1 sh

4.设置基本目录(app)

  1. "autoload": {
  2. "psr-4": {
  3. "App\\": "app/"
  4. }
  5. }

执行composer dump-autoload映射app目录

创建一个http服务

  1. $http = new Swoole\Http\Server("0.0.0.0", 80);
  2. $http->on('request', function ($request,Swoole\Http\Response $response) {
  3. $response->end("<h1>hello</h1>");
  4. });
  5. $http->start();
RabbitMQ PHP    2021-12-11 12:28:35    6    0    0

介绍

RabbitMQ是一个消息代理器:它接受和转发消息。你可以把它当作一个邮局:当你把邮件放在信箱里时,你可以肯定邮差先生最终会把邮件送到你的收件人那里。在这个比喻中,RabbitMQ就是这里的邮箱,邮局和邮差。

RabbitMQ和邮局之间的主要区别是,它不处理纸张,而是接受、存储和转发二进制数据‒消息。

RabbitMQ,和一般的消息传递,使用专业术语。

生产者的工作就是发送消息。发送消息的程序是生产者:

title

队列类比一个邮箱,存在于RabbitMQ, 然而信息流通过RabbitMQ和您的应用程序,他们只能存储在一个队列。队列只受主机内存和磁盘限制的约束,它本质上是一个很大的消息缓冲区。会有许多生产者可以发送到一个队列的消息,许多消费者可以尝试从一个队列接收数据。这就是我们如何表示队列的方式:

title

消费者和生产者有着相似的意义. 消费者无非就是等待消息然后处理的程序:

title

请注意,生产者、消费者和代理不必同一主机上;事实上,在大多数应用程序中它们没有这样做。

"Hello World"

(使用PHP amqplib客户端)

在本教程的这一部分中,我们将用PHP编写两个程序;一个生产者发送一条消息,一个用户接收消息并将它们打印出来。我们会PHP amqplib API的忽略一些细节,集中在这个非常简单的事情刚刚开始。这是一个“Hello World”的消息传递。

在下图中,“p”是我们的生产商,“C”是我们的消费者。在中间的框是一个队列的消息缓冲区,RabbitMQ保持代表的消费。

title

PHP amqplib客户端库

RabbitMQ有很多协议。本教程介绍AMQP 0-9-1,这是一个开放的、通用的协议消息。有许多不同的语言RabbitMQ一批客户。我们将在本教程中使用PHP amqplib,composer解决依赖管理。

添加composer.json:

  1. {
  2. "require": {
  3. "php-amqplib/php-amqplib": ">=2.6.1"
  4. }
  5. }
  1. composer install
  2. # 或者 直接运行包引入
  3. composer require php-amqpli
MongoDB    2021-12-11 10:27:06    4    0    0

本教程适合 Mac 及 linux 用户的二进制版安装。

Mac, Linux 用户的源码版安装,参见这里
Windows 用户的二进制版安装,参见这里
Windows 用户的源码版安装,参见这里
安装步骤:

下载 leanote 二进制版。
安装 mongodb。
导入初始数据。
配置 leanote。
运行 leanote。

1. 下载 leanote 二进制版

由此处下载 leanote 最新二进制版

假设将文件下载到 /home/user1 目录下, 解压文件从而在 /home/user1 目录下生成 leanote目录:

  1. $> cd /home/user1
  2. $> tar -xzvf leanote-darwin-amd64.v2.0.bin.tar.gz

2. 安装 mongodb

2.1 安装 mongodb

到 mongodb 官网 下载相应系统的最新版安装包,或者从以下链接下载旧版本:

64位 linux mongodb 3.0.1 下载链接: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.1.tgz
下载到 /home/user1下, 直接解压即可:

  1. $> tar -xzvf mongodb-linux-x86_64-3.0.1.tgz/
  2. $> mv mongodb-linux-x86_64-3.0.6/ /home/mongodb # 将解压包拷贝到指定目录
  3. $> mkdir -p /data/db # 创建数据库目录

为了快速使用mongodb命令, 可以配置环境变量。编辑 ~/.profile/etc/profile 文件, 将mongodb/bin路径加入即可:

  1. $> sudo vim /etc/profile

此处实例使用了vim文本编辑器,你可以使用自己熟悉的编辑器。

在/etc/profile中添加以下行,注意把用户名(u

MongoDB    2021-12-11 10:16:41    5    0    0

1.查找

  • show dbs
  • show collections;
  • 查看所有用户账号信息 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("索引名称")
  1. // LIKE模糊查询userName包含A字母的数据(%A%)
  2. // SQL:SELECT * FROM UserInfo WHERE userName LIKE "%A%"
  3. db.UserInfo.find({userName :/A/})
  4. // LIKE模糊查询userName以字母A开头的数据(A%)。
  5. // SQL:SELECT * FROM UserInfo WHERE userName LIKE "A%"
  6. db.UserInfo.find({userName :/^A/})
  7. //查询商品名称长度大于25个字符的商品
  8. db.item.find({item_name:{$exists:true},$where:"(this.item_name.length > 25)"}).limit(5)
  9. db.item.find({"item_name": {"$exists": true, "$regex": /^.{25,}$/}}).limit(5)
  10. //查询商品名称长度小于5个字符的商品
  11. db.item.find({$where:"this.item_name.length < 5"}).limit(5)
  12. db.item.find({"item_name": {"$regex": /^.{0,5}$/}}).limit(5)

2.创建

MongoDB    2021-12-11 10:09:01    7    0    0

MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录

一,访问控制的参数

1,绑定IP地址

mongod 参数:--bind_ip

默认值是所有的IP地址都能访问,该参数指定MongoDB对外提供服务的绑定IP地址,用于监听客户端 Application的连接,客户端只能使用绑定的IP地址才能访问mongod,其他IP地址是无法访问的。

2,设置监听端口

mongod 参数:--port

MongoDB 默认监听的端口是27017,该参数显式指定MongoDB实例监听的TCP 端口,只有当客户端Application连接的端口和MongoDB实例监听的端口一致时,才能连接到MongoDB实例。

3,启用用户验证

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.

4,权限认证

  1. mongo 参数:--username <username>, -u <username>
  2. mongo 参数:--password <password>, -p <password>
  3. mongo 参数:--authenticationDatabase <dbname>
  4. mongo -u workerman_rw -p DQP5cK7! --authenticationDatabase
8/12