Nacos服务治理—负载均衡

引入负载均衡

在消费方引入负载均衡机制,同时简化获取服务提供者信息的流程

Spring Cloud引入组件LoadBalance实现负载均衡
添加依赖

复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

properties配置

复制代码
spring.application.name=service-consumer
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
server.port=6082

主类上添加对应的注解

复制代码
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer2Application {
public static void main(String[] args) {
SpringApplication.run(Consumer2Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

定义对应的控制器,需要访问服务提供者

复制代码
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{name}")
public String test(@PathVariable String name){
//使用LB后具体的URL地址中使用服务提供者的名称来替代原始的主机名和端口号
String res = restTemplate.getForObject("http://serviceprovider/users/hello?username=" + name, String.class);
return res;
}
}

验证测试

缓存配置

使用LB从Nacos获取服务的注册信息,可以在本地进行缓存。添加配置即可

复制代码
spring.cloud.loadbalancer.cache.enabled=true 启用本地缓存,可以根据实际情况权衡
spring.cloud.loadbalancer.cache.capacity=1000 设置缓存空间大小
spring.cloud.loadbalancer.cache.ttl=20 缓存的存活时间,单位为s

订阅更新

缓存有可能和远程的注册信息不一致,所以引入长连接的订阅实现Nacos的主动通知更改

复制代码
spring.cloud.nacos.discovery.watch.enabled=true

引入OpenFeign

添加依赖:

复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

定义配置

复制代码
server.port=6083
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=service-consumer
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

在主类或者配置类上添加注解以支持OpenClient应用

复制代码
@EnableFeignClients // 激活 @FeignClient
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}

定义http伪客户端接口

复制代码
@FeignClient("service-provider") // 指向服务提供者应用
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}

定义控制器,通过feign接口调用远程的服务提供者

复制代码
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private ProviderClient providerClient;
@GetMapping("/{name}")
public String test(@PathVariable String name){
String res = providerClient.sayHello(name);
return res;
}
}

测试

负载均衡策略配置

LB中提供了三种负载均衡策略,同时提供接口允许用户自定义扩展

1、定义配置类

复制代码
public class FeignClientConfiguration {
@Bean
public ReactorLoadBalancer
reactorServiceInstanceLoadBalancer(ObjectProvider
serviceInstanceListSuppliers, Environment environment) {
String name =
environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(serviceInstanceListSuppliers, name);
}
}

2、可以全局或者局部配置使用设置的负载均衡策略

复制代码
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}

局部配置

如果通过使用OpenFeign访问远程的服务提供者,则可以配置由于网络、连接、读取等问题出现访问失

败时,自动执行重试处理

1、首先定义配置

复制代码
public class FeignClientConfiguration {
@Bean
public Retryer retryer(){
return new Retryer.Default(100, 1000, 2);
//表示每间隔100ms,最大间隔1000ms重试一次,最大重试次数是1,因为第三个参数包含了
第一次请求
}
}

2、可以在注解中进行全局配置和局部配置

全局配置

复制代码
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}

局部配置

复制代码
@FeignClient(value="service-provider",configuration =
FeignClientConfiguration.class)
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}

服务降级配置

在使用注册中心时,OpenFeign作为服务间通信的组件,它本身集成了负载均衡能力、错误重试、日

志、服务熔断等机制,同时也能够支持点对点的通信方式,让开发者感觉更像是调用本地接口,而不是

发起HTTP请求

具体的服务降级是依赖Sentinel组件实现的,所以需要添加Sentinel依赖

1、添加依赖

复制代码
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、开启服务熔断配置application.properties

复制代码
feign.circuitbreaker.enabled=true 1

3、定义对应的Fallback Factory实现

复制代码
@Component
public class ProviderClientFallbackFactory implements
FallbackFactory<ProviderClient> {
@Override
public ProviderClient create(Throwable cause) {
return new ProviderClient() {
@Override
public String sayHello(String username) {
return cause.getMessage();
}
};
}
}

4、配置使用Fallback降级处理

复制代码
@FeignClient(value="service-provider",fallbackFactory =
ProviderClientFallbackFactory.class)
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}
相关推荐
✧北辰٩(ˊωˋ*)و南冥✧7 小时前
nginx 负载均衡配置(加解决重复登录问题)
运维·nginx·负载均衡
大曰编程7 小时前
分布式系统高可用性设计-负载均衡与容错机制深度解析
负载均衡
CZZDg9 小时前
LVS负载均衡-DR模式配置
运维·负载均衡·lvs
怀揣小梦想1 天前
微服务项目远程调用时的负载均衡是如何实现的?
微服务·架构·负载均衡
Orlando cron5 天前
源哈希(sh)解析
负载均衡·哈希算法
爬山算法5 天前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
你不知道我是谁?5 天前
负载均衡--四层、七层负载均衡的区别
运维·服务器·负载均衡
梁bk6 天前
[Nginx]反向代理和负载均衡
运维·nginx·负载均衡
你不知道我是谁?7 天前
负载均衡--常见负载均衡算法
运维·负载均衡
星融元asterfusion7 天前
基于路径质量的AI负载均衡异常路径检测与恢复策略
人工智能·负载均衡·异常路径