简单的说,微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过诸如RESTful API的方式互相调用
下面简单概述此次搭建微服务中所用到的组件
Nacos、Spring Cloud GateWay、Seata、RocketMQ、OpenFeign、Graylog、docker、Sleuth、zipkin、Elasticsearch
1.Spring Cloud
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,提供配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。也是目前最为主流的微服务框架。
1.1.服务注册中心(NACOS)
微服务架构,核心是为了解决应用微服务化之后的服务治理问题。一个微服务如何发现其他微服务呢?所以需要使用到微服务架构中的一个最重要的组件:服务注册中心
此次采用NACOS作为服务注册发现
1.1.1.NACOS安装
官网地址:https://nacos.io
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在
以下版本环境中安装使用:
1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
2. 64 bit JDK 1.8+;
3. Maven 3.2.x+;
进入安装程序的bin目录:
Linux/Unix/Mac启动方式:
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
Windows启动方式:
启动命令:
startup.cmd -m standalone
或者双击startup.cmd运行文件。
启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos ,打开如下nacos控制台登录页面:
使用默认用户名:nacos,默认密码:nacos 登录即可打开主页
1.1.1.1. 外部mysql数据库支持
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步
骤:
1.数据库,版本要求:5.6.5+ ,mysql 8 以下
2.新建数据库nacos_config
3.执行conf/nacos-mysql.sql初始化文件
4.修改conf/application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=用户名
db.password=密码
docker安装
1.拉取镜像
docker pull nacos/nacos-server
2.启动镜像
docker run -d --name nacos -p 8848:8848 --env MODE=standalone --env SPRING_DATASOURCE_PLATFORM=mysql --env MYSQL_SERVICE_HOST=rm-xx.mysql.rds.aliyuncs.com --env MYSQL_SERVICE_DB_NAME=nacos --env MYSQL_SERVICE_USER=bms_test --env MYSQL_SERVICE_PASSWORD=oRgeArrkxL3tcnxx nacos/nacos-server
1.1.2.工程搭建
父工程POM
由于需要使用nacos,建议使用阿里巴巴的spring-cloud-alibaba-dependencies做为依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模块POM
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
子模块配置文件:bootstrap.yml
spring:
application:
name: api-gateway
main:
allow-bean-definition-overriding: true
cloud:
nacos:
#nacos配置中心
config:
#nacos配置中心地址
server-addr: 127.0.0.1:8848
#主配置文件类型
file-extension: yaml
#配置中心命名空间ID
namespace: 623796d1-b7c5-48bb-9b15-dab23cccec2b
#分组
group: TEST_GROUP
#多配置
ext-config[0]:
data-id: feign-timeout.yaml
refresh: true
group: TEST_GROUP
ext-config[1]:
data-id: zuul.yaml
refresh: true
group: TEST_GROUP
#注册中心
discovery:
#注册中心地址
server-addr: 127.0.0.1:8848
#命名空间
namespace: 623796d1-b7c5-48bb-9b15-dab23cccec2b
子模块启动类
@SpringBootApplication
/*开启服务注册与发现*/
@EnableDiscoveryClient
public class GateWayServerApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayServerApplication.class, args);
}
}
1.2.配置中心(NACOS-CONFIG)
当服务数量超过一定数量时,会带来微服务的配置管理问题。如果此时还需每个服务分别维护配置文件将不太现实。
NACOS提供中心化、外部化和动态化的方式管理所以服务的配置。消除了变更配置时重新部署服务的需要,让配置管理变得简单高效。
1.2.1.Nacos管理
浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单配置管理->配置列表:
自行编辑/新增配置。Data Id默认为spring.application.name+file-extension
获取配置集需要指定:
1、nacos服务地址,必须指定
2、namespace,如不指定默认public
3、group,如不指定默认 DEFAULT_GROUP
4、dataId,必须指定
Nacos数据模型
子模块POM
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
1.3.API 网关(SPRING CLOUD GATEWAY)
网关作为服务统一入口,服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服务网关可以提高微服务的安全性,网关校验请求的合法性,请求不合法将被拦截,拒绝访问。
SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
API网关模块POM
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
gateWay配置文件
gateway:
discovery:
locator:
enabled: true
routes:
- id: service-a
uri: lb://service-a
predicates:
- Path=/api/a/**
- id: service-b
uri: lb://service-b
predicates:
- Path=/api/b/**
子模块启动类
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayServerApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayServerApplication.class, args);
}
}
1.4.RPC 远程调用(FEIGN)
feign提供了微服务之间的相互远程调用。而且Spring cloud feign封装了负载均衡,默认为轮询。
子模块POM
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
子模块配置文件:bootstrap.yml
server:
port: 8100
spring:
application:
name: service-a
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: properties
namespace: 623796d1-b7c5-48bb-9b15-dab23cccec2b
group: TEST_GROUP
ext-config[0]:
data-id: feign-timeout.yaml
refresh: true
group: TEST_GROUP
ext-config[1]:
data-id: seata.yaml
refresh: true
group: TEST_GROUP
discovery:
server-addr: 127.0.0.1:8848
namespace: 623796d1-b7c5-48bb-9b15-dab23cccec2b
子模块启动类
@SpringBootApplication
@EnableDiscoveryClient
/*开启Feign客户端,用于远程调用*/
@EnableFeignClients
public class AServerApplication {
public static void main(String[] args) {
SpringApplication.run(AServerApplication.class, args);
}
}
其他服务新建个接口类使用@FeignClient(value = "微服务名称"),即可远程调用该服务
@FeignClient(value = "service-b")
public interface CallBService {
@GetMapping("/service")
public String service();
@PostMapping("/v1/storage/create")
public StorageDto create(@RequestBody StorageDto dto);
}
1.5.分布式事务(SEATA)
Seata 是一款阿里巴巴开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式。而且对业务无侵入,即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入,减少分布式事务解决方案所带来的性能消耗。
Seata组件
TC (Transaction Coordinator) 事务协调者 :维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
1.5.1.搭建Seata TC 协调者
1.修改conf/file.conf文件
2.将mode="file"改为mode="db"
3.db部分配置mysql相关信息
db {
DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = "druid"
dbType = "mysql"
//注意如果是mysql8版本,此处采用cj驱动,url后缀需要加serverTimezone=Asia/Shanghai
driverClassName = "com.mysql.cj.jdbc.Driver"
url = "jdbc:mysql://xx.mysql.rds.aliyuncs.com:3306/seata?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8"
//用户名和密码
user = "seata_test"
password = ""
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
4.修改registry.conf文件
4.1.将registry和config部分的由type="file"都换成type="nacos"(注意是2处地方)将seata注册到nacos
4.2.将2处的nacos配置根据实际情况需要调整参数,本机启动nacos则不需要调整
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.1.1:8848"
group = "DEFAULT_GROUP"
namespace = "623796d1-b7c5-48bb-9b15-dab23cccec2b"
cluster = "default"
username = "nacos"
password = ""
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "192.168.1.1:8848"
namespace = "f46bbdaa-f11e-414f-9530-e6a18cbf91f6"
group = "SEATA_GROUP"
username = "nacos"
password = ""
}
}
docker 安装seata
1.下载镜像
docker pull seataio/seata-server:1.3.0
2.运行容器
docker run --name seata-server -p 8091:8091 -d seataio/seata-server:1.3.0
3.将容器中的配置拷贝到/usr/local/seata-1.3.0
docker cp seata-server:/seata-server /usr/local/seata-1.3.0
4.完成后就会在/usr/local/seata-1.3.0出现容器的配置,我们现在可以将原来容器停止并删除
docker stop seata-server
docekr rm seata-server
5.修改配置文件
进入目录/usr/local/seata-1.3.0/resources中修改file.conf和registry.conf中的内容
如上所述
6.启动seata
docker run --restart always -p 8091:8091 --name seata-server -v /usr/local/seata-1.3.0:/seata-server -e SEATA_IP=120.77.170.239 -e SEATA_PORT=8091 seataio/seata-server:1.3.0
注:如果服务器JVM内存不足可以添加启动参数
-e JAVA_OPTS='-Xmx512m -Xms512m -Xmn512m'
5.双击启动bin/seata-server.bat文件启动服务
6.下载nacos-config.脚本和config.txt。下载地址:seata/script/config-center at develop · seata/seata · GitHub
7.在seata目录下新建 script 目录,将 nacos-config.sh 放入script 目录下
8.config.txt:该文件存放在将seata目录下,与conf、lib目录同级,seata的非常全的配置内容,可通过nacos-config.sh脚本推送到nacos配置中心
9.修改config.txt的内容
10.打开git bash或linux类命令行,执行sh脚本(注意脚本是否有执行的权限)
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t f46bbdaa-f11e-414f-9530-e6a18cbf91f6 -u nacos -w nacos
等待脚本推送seata配置到nacos配置中心
推荐使用AT模式,是对业务无入侵
1.5.2.AT模式运行机制
AT模式的特点就是对业务无入侵式,整体机制分二阶段提交
●两阶段提交协议的演变:
○一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
○二阶段:
■提交异步化,非常快速地完成。
■回滚通过一阶段的回滚日志进行反向补偿。
在 AT 模式下,用户只需关注自己的业务SQL,用户的业务SQL 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
Seata具体实现步骤
1TM端使用@GlobalTransaction进行全局事务开启、提交、回滚
2TM开始RPC调用远程服务
3RM端seata-client通过扩展DataSourceProxy,实现自动生成UNDO_LOG与TC上报
4TM告知TC提交/回滚全局事务
5TC通知RM各自执行commit/rollback操作,同时清除undo_log
/*开启分布式事务*/
@GlobalTransactional
public RequestOrder createOrderAndStorage(OrderDto dto){
this.aCreate(dto)
allBService.bCreate(dto);
}
:需要执行conf目录下db_store.sql、db_undo_log.sql初始化sql文件
子模块POM
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<!--移除掉该starter中自带的依赖,该依赖版本较低-->
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--单独添加seata 1.3.0的依赖-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
配置中心添加seata.yaml配置文件
seata:
application-id: ${spring.application.name}
enabled: true
tx-service-group: default_tx_group
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group: TEST_GROUP
namespace: bc7b3b01-9f48-4ac4-8e03-c0545564fb88
username: nacos
password: nacos
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group: DEFAULT_GROUP
namespace: 623796d1-b7c5-48bb-9b15-dab23cccec2b
username: nacos
password: nacos
需要开启分布式事务的服务引用seata.yaml配置文件即可
spring:
application:
name: service-a
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: properties
namespace: 623796d1-b7c5-48bb-9b15-dab23cccec2b
group: TEST_GROUP
ext-config[0]:
data-id: seata.yaml
refresh: true
group: TEST_GROUP+
1.6.日志采集管理(GRAYLOG)
由于微服务的相互隔离,各自产生的日志会分布在不同的实例。一旦集群庞大,传统的逐个查阅日志将会变得效率低下而难以排查。因此需要使用统一日志收集方案进行日志的聚合。
本次采用Graylog工具进行日志收集
Graylog拥有一体式方案,安装部署方便、高可用、数据可视化、快速检索等
1.6.1.工作流程介绍
架构图所示包含三个组件,分别是:
Elasticsearch:持久化存储、检索和分析日志文件数据
MongoDb:存储关于 Graylog 的相关配置
Graylog:提供对外采集接口、可视化界面
1.6.2.安装Graylog
利用docker-compose进行快速安装
1、新建graylog目录
mkdir graylog
2.新建docker-compose.yml和具体配置内容
vim docker-compose.yml
version: '2'
services:
# MongoDB: https://hub.docker.com/_/mongo/
mongodb:
image: mongo:3
# Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docker.html
# elasticsearch:
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1
# environment:
# - http.host=0.0.0.0
# - transport.host=localhost
# - network.host=0.0.0.0
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# ulimits:
# memlock:
# soft: -1
# hard: -1
# mem_limit: 1g
# Graylog: https://hub.docker.com/r/graylog/graylog/
graylog:
image: graylog/graylog:3.0
environment:
# CHANGE ME (must be at least 16 characters)!
- GRAYLOG_PASSWORD_SECRET=somepasswordpepper
# Password: admin
# echo -n "Enter Password: " && head -1
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
- GRAYLOG_HTTP_EXTERNAL_URI=http://120.77.170.239:9000/
- GRAYLOG_ELASTICSEARCH_HOSTS=http://120.77.170.239:9200
- GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
links:
- mongodb:mongo
# - elasticsearch
depends_on:
- mongodb
# - elasticsearch
ports:
# Graylog web interface and REST API
- 9000:9000
# Syslog TCP
- 1514:1514
# Syslog UDP
- 1514:1514/udp
# GELF TCP
- 12201:12201
# GELF UDP
- 12201:12201/udp
注:由于Elasticsearch需要共用,配置项中禁用elasticsearch,通过environment中的GRAYLOG_ELASTICSEARCH_HOSTS链接外部Elasticsearch
1.6.2.1.docker启动Elasticsearch
docker run -d -p 9200:9200 -p 9300:9300 docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1
暴露9200/9300端口,通过docker ps 命令查看容器是否成功启动
启动成功后浏览器中打开:http://127.0.0.1:9200/
即可看到Elasticsearch运行成功的信息
{
"name" : "XFJIi7w",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "EBywGRbDQpyrMdLWgplSSw",
"version" : {
"number" : "6.6.1",
"build_flavor" : "oss",
"build_type" : "tar",
"build_hash" : "1fd8f69",
"build_date" : "2019-02-13T17:10:04.160291Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
1.6.2.2.启动Graylog
docker-compose up
Compose是一个用来定义和运行复杂应用的Docker工具,通过一个配置文件中的services来定义容器。docker-compose.yml配置文件中定义了mongoDB和Graylog。
启动成功后浏览器中打开:http://127.0.0.1:9000/
即可进入Graylog web UI界面
默认账号密码为:admin
如需修改密码可以修改docker-compose.yml中的GRAYLOG_ROOT_PASSWORD_SHA2选项。
可通过下列加密命令生成新密码
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
1.6.2.3.配置收集日志接口
子项目POM
<dependencies>
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>logback-gelf</artifactId>
<version>4.0.2</version>
</dependency>
</dependencies>
添加logback-gray.xml
<configuration>
<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
<graylogHost>120.77.170.239</graylogHost>
<graylogPort>12201</graylogPort>
</appender>
<root level="INFO">
<appender-ref ref="GELF"/>
</root>
</configuration>
即可接管日志并采集到graylog。
注:此时本地将不再打印输出日志,需添加ConsoleAppender
<!-- ConsoleAppender:把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %p (%file:%line\)- %m%n</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
进入Graylog web UI界面添加日志监控规则
System/Inputs => inputs
选择GRLF UDP =>Luanch new input,GELF UDP是garylog推荐使用的udp协议的传输模式
勾选 Global ,为全部节点可用。也可以选择单独的节点进行配置。title为自定义,绑定地址与端口均无需修改
保存后启动springboot项目即可采集日志,点击左上角search查看采集的日志
日志检索
例如:message:storage/create。即可搜索出所有message中包含storage/create的日志
1.6.3.微服务日志链路追踪(sleuth+zipkin)
随着系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败。此时就需要用到服务链路追踪
Spring Cloud Sleuth为微服务之间调用提供了一套完整的服务链路跟踪解决方案
1.6.3.1.服务添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
1.6.3.2.调整logback
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
<!-- appender是configuration的子节点,是负责写日志的组件。 -->
<!-- ConsoleAppender:把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <pattern>%d %p (%file:%line\)- %m%n</pattern> -->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
1.6.3.3.启动服务后即可查看请求的链路
[ApplicationName,TraceId, SpanId, Exportable]
ApplicationName:该值必须在bootstrap.properties文件中进行配置,这是由于日志框架启动时间较早造成的。如果是在application.properties文件中进行配置,则会因为该配置数据尚未加载而导致日志框架无法获取到该值。
TraceId:找到完整链路
SpanId:一次链路请求最起始的Span通常被称为根Span(RootSpan),它的ID通常也被作为Trace的ID
Exportable:是否将追踪到的信息输出到Zipkin服务器等日志采集服务器上
[服务名称,traceId(一条请求调用链中 唯一ID),spanID(基本的工作单元,获取数据等),是否让zipkin收集和展示此信息]
1.6.3.4.此时查看链路还是比较繁琐,可整合Zipkin可视化服务
默认日志存储于内存,生产环境可以指定mysql数据库做持久化
安装zipkin
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
Git bash here 中执行上述命令。会下载可直接运行的zipkin jar文件
docker 搭建 zipkin
1、拉镜像
docker pull openzipkin/zipkin
2、运行镜像
docker run -d --restart always -p 9411:9411 --name zipkin openzipkin/zipkin
3、访问
在浏览器访问:http://ip:9411/zipkin/
在浏览器打开:http://localhost:9411/
即可进入链路追踪ui
点击show,即可查看请求的链路
1.7.反应式微服务流-消息队列(ROCKET-MQ)
消息队列是分布式系统中非常重要的组件,解决应用耦合、异步消息、流量消费等问题,提供高性能、高可用、可伸缩、最终一致性的分布式中间件
RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。
1.Name Server: 名称服务充当路由消息的提供者。是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。在消息队列 RocketMQ 中提供命名服务,更新和发现 Broker 服务。
2.Broker:消息中转角色,负责存储消息,转发消息。为消息队列服务器,提供了消息的接收、存储、拉取和转发服务。
3.生产者:与 Name Server 集群中的其中一个节点(随机)建立长链接(Keep-alive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的 Master Broker 建立长链接,且定时向 Master Broker 发送心跳。
4.消费者:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。
1.topic:表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息、物流消息...... 一条消息必须有一个Topic。
2.Queue:主题被划分为一个或多个子主题,称为“message queues”。一个topic下,我们可以设置多个queue(消息队列)。当我们发送消息时,需要要指定该消息的topic。RocketMQ会轮询该topic下的所有队列,将消息发送出去。
定义:Queue是Topic在一个Broker上的分片,在分片基础上再等分为若干份(可指定份数)后的其中一份,是负载均衡过程中资源分配的基本单元。
1.7.1.安装RocketMQ
下载:https://archive.apache.org/dist/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip
以下版本环境中安装使用:
1. 64 bit Linux
2. 64 bit JDK 1.8+;
3. Maven 3.2.x+;
1.7.1.1.解压文件
unzip rocketmq-all-4.4.0-bin-release.zip
1.7.1.2.启动
1.启动NameServer
nohup sh bin/mqnamesrv &
2.查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log
3.启动Broker
nohup sh bin/mqbroker -n localhost:9876 &
4.查看日志
tail -f ~/logs/rocketmqlogs/broker.log
:注意默认JVM启动内存较大,如提示内存不足,可修改JVM内存大小
修改内存大小
vi runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m"
vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
1.7.2.整合项目
子模块POM
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
子模块配置文件:bootstrap.yml
rocketmq:
#nameServer地址
nameServer: 120.77.170.239:9876
producer:
#消息分组
group: my-producer-group
生产者推送消息
RocketMQTemplate.convertAndSend("springboot-rocketMq","Hallo world");
消费者消费消息
@RocketMQMessageListener(consumerGroup = "my-producer-group", topic = "springboot-rocketMq")
public class MqListener implements RocketMQListener<String> {
public void onMessage(String s) {
System.out.println(s);
}
}
若有收获,就点个赞吧