入门
微服务框架
分布式服务存在的问题:
- RPC远程调用超时问题
- 安全问题:加密访问、令牌传输数据、限流、服务保护等
- 服务治理
- 快速定位链路错误
注册中心
作用
- 存放服务接口调用地址
- 心跳机制,动态感知服务上下线
安装 NACOS
参考链接:https://github.com/nacos-group/nacos-docker/tree/master/example
- docker-compose.yml文件 启动命令 docker-compose up
a. 初始化数据库
# 需要执行mysql.sql创建数据库。数据表、授权用户
#mysql.sql链接:https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql
SELECT host, user from user;
create user 'nacos'@'%' identified by 'nacos';
CREATE DATABASE nacos_db;
grant all privileges on nacos_db.* to 'nacos'@'%' identified by 'nacos';
flush privileges;
b. docker-compose.yml
version: "3.2"
services:
# nacos注册中心,配置中心
nacos:
image: nacos/nacos-server:latest
restart: on-failure
ports:
- 8848:8848
depends_on:
- mysql
environment:
- MODE=standalone
- JVM_XMS=256m
- JVM_XMX=256m
- JVM_XMN=128m
- PREFER_HOST_MODE=hostname
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- MYSQL_SERVICE_DB_NAME=nacos_db
volumes:
- ./nacos/logs:/home/nacos/logs
- ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
# mysql
mysql:
image: 'mysql:5.7'
ports:
- 3306:3306
volumes:
- /home/dockerdir/mysql/data:/var/lib/mysql
- /home/dockerdir/mysql/conf:/etc/mysql/conf.d
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=111111
- MYSQL_DATABASE=nacos_db
- MYSQL_USER=nacos
- MYSQL_PASSWORD=nacos
docker-compose up 启动成功后,
测试成功:curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
- 创建springboot项目
a. pom版本
2.3.9.RELEASE
Hoxton.SR10
2.2.3.RELEASE
b. b.创建bootstrap.yml, 不能用application.yml否则配置中心报错
Applicaton.yml是由SpringApplicationContext加载的;
Bootstrap.yml是由应用上下文加载的,最优先加载,
而配置中心读取的是application.name,所以加载不到
c. 同一个命令空间,同一个分组的服务之间才能相互调用
server:
port: 9090
spring:
application:
name: myproducerservice
cloud:
nacos:
discovery:
server-addr: 192.168.207.128
group: DEFAULT_GROUP
namespace: 30be54d2-b423-4066-8db8-3a4ad014d649
配置中心
作用
- 统一管理配置文件
- 动态修改配置文件
简单使用
配置中心创建:
Data-Id格式:服务名-版本.yml ${prefix}-${spring.profiles.active}.${file-extension}
服务配置:
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${spring.cloud.nacos.discovery.namespace}
group: ${spring.cloud.nacos.discovery.group}
file-extension: yml
默认不动态刷新
@RefreshScope 实时刷新配置 如果刷新配置报错:更换nacos版本:2.2.3.RELEASE
多版本使用
部署时更换profiles
spring:
profiles:
active: dev
fegin分布式服务调用
负载均衡算法
1.轮询
2.权重轮询
3.随机算法
4.hash一致性
5.固定ip
底层原理
@FeignClient(value = "myproducerservice"
AOP代理:获取注解服务名称,拉取注册中心的服务列表,本地负载均衡器,HtppClient发起请求,超时降级、并发削峰
本质上还是http请求,所以实现类 必须添加@RestController,否则找不到请求方法
服务保护 sentinel
作用
- 动态控制限流规则
通常采用服务保护的措施有:黑名单、限流熔断、服务隔离、服务降级
服务QPS限流
限制每秒请求数量服务线程数限流
某个服务接口有自己的线程池,线程数为N,大于N时直接降级
服务雪崩:tomcat共有N个线程,高并发时全部处理某个接口,导致其余接口不能响应
解决:1、每个接口有自己的线程池;2、接口的阈值限制热词限流
集群流量管控
服务降级
服务限流使用
参考链接:https://blog.csdn.net/jianzhang11/article/details/103490858
- 执行命令
docker run --name sentinel -p 8858:8858 -d bladex/sentinel-dashboard:latest
- 降级服务配置
sentinel:
transport:
dashboard: 192.168.207.128:8858
# 虚拟机时连接不上,需要设置VMnet8
clientIp: 192.168.207.1
eager: true
- 设置降级
@SentinelResource
- sentinel dashbord 设置规则
虚拟机无法设置规则:https://blog.csdn.net/miachen520/article/details/113799600
创建规则之后不起作用:
a.流控的blockHandler自定义资源必须为public static 函数
b.@SentinelResource注解的value与@RequestMapping的value一样
c.资源名是否与@SentinelResource的value一样;
d.参数、返回值是否一样,且最后加BlockException
限流规则持久化
参考链接:https://blog.didispace.com/spring-cloud-alibaba-sentinel-2-1/
- 通过Nacos配置文件,修改流控规则---拉取--->Sentinel Dashboard界面显示最新的流控规则。
dependency>
com.alibaba.csp
sentinel-datasource-nacos
# 持久化
sentinel:
datasource:
ds:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
groupId: ${spring.cloud.nacos.discovery.group}
namespace: ${spring.cloud.nacos.discovery.namespace}
dataId: ${spring.application.name}-sentinel
data-type: json
rule-type: flow
- Nacos配置,
可以参考sentinel日志,创建一个规则就会打印一条日志
[
{
// 资源名称
"resource": "helloSentinel",
// 来源应用
"limitApp": "default",
// 阀值类型,0-线程数,1-qps
"grade": 1,
// 单机阀值
"count": 1,
// 流控模式,0-直接,1-关联,2-链路
"strategy": 0,
// 流控效果,0-快速失败,1-warm up,2-排队等待
"controlBehavior": 0,
// 是否集群
"clusterMode": false
}
]
网关限流使用
网关是有服务接口的统一入口,所以通常都是在网关处进行限流降级
网关 gateway
作用
- 后端服务集群入口,路由转发
- 过滤器,乱码等问题
- 登录用户认证 token
- 服务限流
- 解决跨域问题
拓展:
问题:一个服务集群有多个网关,nginx怎么感知网关的动态上下线?
解决:动态感知:https://segmentfault.com/a/1190000021686433
单机使用
org.springframework.cloud
spring-cloud-starter-gateway
gateway:
discovery:
locator:
# 开启以服务ID去注册中心上获取转发服务
enabled: true
# lower-case-service-id: true
# 路由策略
routes:
# 自定义的路由ID,保持唯一
- id: memberservice
# 请求路由条件
predicates:
- Path=/member/**
# 转发目标服务地址,以lb://开头(lb代表从注册中心获取服务)
uri: lb://mymemberservice
# StripPrefix 转发到mymemberservice请求时不加则请求为http://member/GetMapping,加上则http://GetMapping
filters:
- StripPrefix=1
过滤器 GlobalFilter
解决请求参数乱码、用户权限认证等 ServerWebExchange#getRequest
请求限流
微服务的限流都是在gateway/nginx
https://www.cnblogs.com/pu20065226/p/11426279.html
限流算法:
- 计数器
- 漏桶算法
- 令牌桶算法
跨域
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
集群高可用
总之对外提供一个统一的入口。而后面都是集群,做高可用,高并发分流等等。
- Nginx做网关集群,当一个网关挂机,可以通过配置,进行切换
- Lvs做nginx集群,LVS+keepalive+nginx实现集群高性能负载均衡配置
- DNS+VIP(虚拟IP)
待更新......
分布式事务 Seata
介绍
- 发起方TM申请构建全局事务协调者TC
- 发起方TM与TC建立一个长连接,并申请全局事务唯一ID
- 发起方TM调用RPC接口参与方RM,请求头中带上全局事务ID,生产undolog日志
- 参与方获取到全局事务ID,通知事务协调者TC加入该事务组中,生产undolog日志
- 一旦出现调用报错,则执行undolog日志,并通知事务协调者TC,统一回滚
使用
docker run --name seata-server -p 8091:8091 seataio/seata-server:latest
待更新......
分布式链路追踪
介绍
https://blog.didispace.com/spring-cloud-starter-dalston-8-4/
使用
- 执行命令
docker run -d --restart always -p 9411:9411 --name zipkin openzipkin/zipkin
- 配置
# 参考链接:https://zhuanlan.zhihu.com/p/125700427
io.opentracing.contrib
opentracing-spring-zipkin-web-starter
0.1.4
# 分布式链路日志
opentracing:
zipkin:
enabled: true
http-sender:
base-url: http://localhost:9412/
或者
# 参考链接:https://www.jianshu.com/p/121d6b0c66fe)
org.springframework.cloud
spring-cloud-starter-zipkin
# 分布式链路日志
zipkin:
base-url: http://192.168.207.128:9412/
enabled: true
service:
name: ${spring.application.name}
sender:
type: web
sleuth:
sampler:
probability: 1.0
拓展:Nacos共享配置
shared-configs[0]:
dataId:
group:
refresh: true
- Elasticsearch持久化
# zipkin分布式链路追踪
zipkin:
ports:
- 9411:9411
image: "openzipkin/zipkin:2.18.0"
environment:
- STORAGE_TYPE=elasticsearch
- ZIPKIN.STORAGE.ELASTICSEARCH.INDEX=zipkin
- ZIPKIN.STORAGE.ELASTICSEARCH.INDEX-SHARDS=5
- ZIPKIN.STORAGE.ELASTICSEARCH.INDEX-REPLICAS=1
- ES_HOSTS=http://es:9200
depends_on:
- elasticsearch
# elasticsearch
es:
image: "elasticsearch:7.12.0"
ports:
- 9200:9200
environment:
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- Zipkin + Kafka + Elasticsearch日志链路
Kafka有削峰功能
服务健康监控 Springboot Admin
参考链接:https://www.jianshu.com/p/21c32276b2d3
作用
- 显示健康状况
- 显示详细信息
- JVM和内存指标
- 服务宕机告警
安装
参考链接:https://www.yuque.com/u1300481/kb/klibuc
安全权限认证
权限认证 oauth2
思想参考:https://www.cnblogs.com/msi-chen/p/13527032.html
实现参考:https://www.jianshu.com/p/d7146fa768ef