SpringCloud
1.远程调用
添加RestTemplate作为bena,调用RestTemplate.getForObject()方法,参数是url和类字节码
2.Eureka注册中心
作用:获取远程调用ip和端口,实现负载均衡,检查提供者是否健康
搭建流程:
搭建服务端
-
注册中心服务端:eureka-server,这必须是一个独立的微服务(模块)
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
编写启动类,需要@SpringBootApplication和@EnableEurekaServer注解
-
编写配置文件
server: port: 10086 spring: application: name: eureka-server # 模块名称 eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka # 默认地址
-
启动服务
将其他服务注册到eureka-server中
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
编写配置文件
spring: application: name: userservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka # eureka地址
-
启动多个实例
服务发现
- 给RestTemlate这个bean添加@LoadBalanced注解实现负载均衡
- 修改之前的RestTemplate.getForObject()方法,讲ip和端口改为消费者的名字即可
3.Ribbon负载均衡
SpringCloud底层利用Ribbon组件实现负载均衡
LoadBalancerInterceptor拦截请求从eureka更具服务id获取服务列表,然后利用负载均衡算法替换服务id
负载均衡策略
负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:
默认实现轮询
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑 |
自定义负载均衡策略
-
定义一个新的IRule
@Bean public IRule randomRule(){ return new RandomRule(); }
-
配置文件
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
一般用默认的负载均衡规则,不做修改。
饥饿加载
Ribbon默认实现懒加载,第一次访问才会创建按LoadBalanceClent,请求时间长,
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients: userservice
4.Nacos注册中心
安装自行解决
启动命令
startup.cmd -m standalone
注册服务
-
在父工程pom文件中的
<dependencyManagement>
中引入SpringCloudAlibaba的依赖:<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>
然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
注意:不要忘了注释掉eureka的依赖。
-
配置nacos地址
# 在微服务中配置nacos地址 spring: cloud: nacos: server-addr: localhost:8848
-
启动nacos
服务分级存储模型
一个服务可以有多个实例,nacos将一个机房的实例划分为一个集群
也就是说一个服务可以包含多个集群,如上海,杭州,北京,每个集群又存在多个实例,形成分级模型
微服务访问时要尽可能访问同集群实例,这样更快
配置集群
-
修改配置文件
spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ # 集群名称
-
同集群优先的负载均衡
# 默认的不能实现同集群优先,nacos提供了一个NacosRule的实现 userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
权重配置在nacos中配置
环境隔离
nacos中可以有多个namespace
namespace中有group,service等
不同namespace互相隔离,服务不可见
-
在nacos中创建namespace
-
给服务添加namespace
spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
永久实例
spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
5.Nacos配置管理
统一配置管理
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
-
在配置列表添加配置即可
ID : [服务名称]-[profile].[后缀名]
-
从微服务拉取配置
-
引入nacos-config客户端依赖
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
添加bootstrap.yaml
# 会根据配置在扫描application之前读取到服务名称 spring: application: name: userservice # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
-
读取nacos配置 @Value注入即可
-
配置热更新
方式一:在@Value注入的变量类上添加注解@RefreshScope
方式二:使用@ConfigurationProperties注解代替@Value注解
配置共享
在nacos中添加一个yaml文件
在服务中拉取
6.Feign远程调用
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
添加@EnableFeignClients开启Fegin功能
-
编写客户端
使用优化
配置连接池
最佳实践
继承
抽取feign-api模块