#博学谷IT学习技术支持#
个人笔记后续会进行内容改进
微服务技术栈:
Nacos注册中心;
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
使用:
- 引入依赖
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置application.yml
spring:
cloud:
nacos:
server-addr: localhost:8848
Nacos流程:
Naocs分级;
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
启动多实例的方式:
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
Nacos统一集群负载均衡:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
Nacos权重配置;
服务器之前的差异可以配置权重比,或者在服务进行升级的时候可以设置权重
Nacos环境隔离:
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
流程:
在ui界面命名空间进行新增,获取命名空间id
在消费者application中配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
Nacos和eureka的区别:
- Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
Nacos统一配置:
流程:
Ui界面新增配置:
- 配置名称{服务名称+生产环境+后缀}
- 分组,默认
- 配置格式:yaml
- 微服务拉取
- 引入nacos-config客户端依赖
- 配置bootstrap.yml配置naocs地址
(applicationname+profiles+file-extension三要素)
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
-
- 通过@value注解获取
配置热更新:
方式一:在@Value注入的变量所在类上添加注解@RefreshScope
方式二:使用@ConfigurationProperties注解代替@Value注解。
@ConfigurationProperties(prefix = "pattern")
配置共享:
优先级:applicationname+profiles+file-extension >applicationname+file-extension >本地配置
Feign远程调用:
步骤:
① 引入依赖
② 添加@EnableFeignClients注解
③ 编写FeignClient接口
④ 使用FeignClient中定义的方法代替RestTemplate
Gateway网关:
步骤:
1. 创建项目,引入nacos服务发现和gateway依赖
2. 配置application.yml,包括服务基本信息、nacos地址、路由
路由配置包括:
1. 路由id:路由的唯一标示
2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
3. 路由断言(predicates):判断路由的规则,
4. 路由过滤器(filters):对请求或响应做处理
Application配置:
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
断言工厂:
| **名称** | **说明** | **示例**
| After | 是某个时间点后的请求 | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
| Before | 是某个时间点之前的请求 | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
| Between | 是某两个时间点之前的请求 | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
| Cookie | 请求必须包含某些cookie | - Cookie=chocolate, ch.p
| Header | 请求必须包含某些header | - Header=X-Request-Id, \d+
| Host | 请求必须是访问某个host(域名) | - Host=**.somehost.org,**.anotherhost.org
| Method | 请求方式必须是指定方式 | - Method=GET,POST
| Path | 请求路径必须符合指定规则 | - Path=/red/{segment},/blue/**
| Query | 请求参数必须包含指定参数 | - Query=name, Jack或者- Query=name
| RemoteAddr | 请求者的ip必须是指定范围 | - RemoteAddr=192.168.1.1/24
| Weight | 权重处理 |
全局过滤器;
实现GlobalFilter
过滤器执行顺序:
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:
排序规则:
- 每一个过滤器都必须指定一个int类型的order值,**order值越小,优先级越高,执行顺序越靠前**。
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
- 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行