书接上回SpringBoot应用,本文开始介绍如何在消费方引入负载均衡机制,同时简化获取服务提供者信息的流程
目录
4.3在主类或者配置类上添加注解以支持OpenClient应用
Spring Cloud引入组件LoadBalance实现负载均衡
一、引入负载均衡
1、添加依赖
<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>
2、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
3、主类上添加对应的注解
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer2Application {
public static void main(String[] args) {
SpringApplication.run(Consumer2Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4、定义对应的控制器,需要访问服务提供者
@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://service-provider/users/hello? username=" + name, String.class);
return res;
}
}
5、验证测试
二、缓存配置
使用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
4.1添加依赖:
<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>
4.2定义配置
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
4.3在主类或者配置类上添加注解以支持OpenClient应用
@EnableFeignClients // 激活 @FeignClient
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}
4.4定义http伪客户端接口
@FeignClient("service-provider") // 指向服务提供者应用
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}
4.5定义控制器,通过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;
}
}