目录
为什么需要注册中心?
注册中心选型
Nacos是什么?
微服务整合Nacos注册中心实战
Nacos Server环境搭建
微服务提供者整合Nacos
微服务调用者整合Nacos
整合RestTemplate+Spring Cloud LoadBalancer实现微服务调用
为什么需要注册中心?
思考:如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化?
//微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢?
String url = "http://localhost:8080/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);
服务注册中心的作用就是服务注册与发现
服务注册:就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去。
服务发现:就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
注册中心选型
Nacos是什么?
Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 优势
1. 易用:简单的数据模型,标准的 restfulAPI,易用的控制台,丰富的使用文档。
2. 稳定:99.9% 高可用,脱胎于历经阿里巴巴 10 年生产验证的内部产品,支持具有数百万服务的大规模场景,具备企业级 SLA 的开源产品。
3. 实时:数据变更毫秒级推送生效;1w 级,SLA 承诺 1w 实例上下线 1s,99.9% 推送完成;10w 级,SLA 承诺 1w 实例上下线 3s,99.9% 推送完成;100w 级别,SLA 承诺 1w 实例上下线 9s 99.9% 推送完成。
4. 规模:十万级服务/配置,百万级连接,具备强大扩展性。
核心功能
服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。
微服务整合Nacos注册中心实战
Nacos Server环境搭建
1) 下载nacos server安装包
选择安装nacos server版本: v2.2.1
wget https://github.com/alibaba/nacos/releases/download/2.2.1/nacos-server-2.2.1.tar.gz
2) 进入conf/application.properties,配置nacos.core.auth.plugin.nacos.token.secret.key密钥
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险 (2.2.0.1后无默认值)
nacos.core.auth.plugin.nacos.token.secret.key=aiDLyHlCgaXB08FL5zS3W6YQZssTVNScY
注意:在2.2.0.1版本后,社区发布版本需要自行填充nacos.core.auth.plugin.nacos.token.secret.key的值,否则无法启动节点。
自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。
随机字符串生成工具: 随机字符串生成 - 程序员工具箱 - 在线工具
3) 解压,进入nacos目录,单机模式启动nacos
windows下编辑bin/startup.cmd修改set MODE="standalone" 表示单机启动。
4)访问nacos的管理端:http://192.168.83.1:8848/nacos ,默认的用户名密码是 nacos/nacos
微服务提供者整合Nacos
以mall-order整合nacos为例
1)引入依赖
mall-order模块pom中引入nacos-client依赖
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)启动类上添加@EnableDiscoveryClient注解,此注解可以省略
3)yml配置文件中配置nacos注册中心地址
server:
port: 8020
spring:
application:
name: mall-order #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 192.168.83.1:8848 #注册中心地址,建议用域名替换ip
4)启动mall-order服务,nacos管理端界面查看mall-order是否注册成功
微服务调用者整合Nacos
服务调用者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
以mall-user整合nacos为例
1)mall-user模块pom中引入nacos-client依赖
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)启动类上添加@EnableDiscoveryClient注解,此注解可以省略
3)yml配置文件中配置nacos注册中心地址
server:
port: 8040
spring:
application:
name: mall-user #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 192.168.83.1:8848
4)启动mall-user服务,nacos管理端界面查看mall-user是否注册成功
整合RestTemplate+Spring Cloud LoadBalancer实现微服务调用
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器实现,用来替代Ribbon。对于负载均衡机制,增加了ReactiveLoadBalancer接口,并提供了基于round-robin轮询和Random随机的实现。
loadbalancer常用的配置:
spring:
cloud:
# 负载均衡配置
loadbalancer:
ribbon:
#禁用ribbon
enabled: false
cache:
#启用本地缓存, 根据实际情况权衡
enabled: true
#缓存空间大小
capacity: 1000
#缓存的存活时间, 单位s
ttl: 2
#caffeine缓存的配置, 需引入caffeine依赖
caffeine:
#initialCapacity初始的缓存空间大小,expireAfterWrite最后一次写入后经过固定时间过期
spec: initialCapacity=500,expireAfterWrite=5s
health-check:
#重新运行运行状况检查计划程序的时间间隔。
interval: 25s
#运行状况检查计划程序的初始延迟值
initial-delay: 30
retry: #需要引入Spring Retry依赖
#该参数用来开启重试机制,默认是关闭
enabled: true
#切换实例的重试次数
max-retries-on-next-service-instance: 2
#对当前实例重试的次数
max-retries-on-same-service-instance: 0
#对所有的操作请求都进行重试
retry-on-all-operations: true
#Http响应码进行重试
retryable-status-codes: 500,404,502
mall-user调用mall-order获取用户订单信息为例
1)引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2)使用RestTemplate进行服务调用
给RestTemplate实例添加 @LoadBalanced 注解,开启@LoadBalanced与loadbalancer的集成。
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3) mall-user中编写调用逻辑,调用mall-order服务
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
//利用@LoadBalanced,restTemplate需要添加@LoadBalanced注解
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);
return result;
}