负载均衡 loadbalancer
1、引入loadbalancer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
2、需要远程调用的restTemplate上加上@LoadBalanced注解
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
3、调用的时候url原来ip地址和端口号的地方改成服务名称
@GetMapping("/helloLoadBalance")
public String getOrderPlus() {
// 负载均衡版
String url = "http://product/product/hello";
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
return forEntity.getBody().toString();
}
服务名称
spring:
application:
name: product
如果服务下有多个地址,多次刷新显示不同的端口
2、自定义负载均衡模式
我这个好像不管用,后面看看
@LoadBalancerClient(name = "product-service",configuration = RandomLoadbalancerConfig.class)
public class RandomLoadbalancerConfig {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
//自定义loadBlancer负载均衡策略
@Bean
public ReactorServiceInstanceLoadBalancer reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
//返回随机轮询负载均衡方式
return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
//返回加权随机轮询负载均衡方式
//return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
//nacos服务注册中心权重的负载均衡策略
//return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name,nacosDiscoveryProperties);
}
}
远程调用Feign
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
2、启动类加上
@SpringBootApplication
@EnableFeignClients
public class Order {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Order.class);
}
}
3、调用者添加接口映射到生产者Controller里的方法
@FeignClient(name = "product",path = "/product")
public interface ProductFeignApi {
@RequestMapping("/hello")
String hello();
}
4、productFeignApi.hello 进行调用
@Autowired
private ProductFeignApi productFeignApi;
@GetMapping("/helloFeign")
public String helloFeign() {
String hello = productFeignApi.hello();
return hello;
}
实现原理
- @EnableFeignClients会扫描加了@FeignClient注解的类
- 会运用动态代理技术和反射,获取到类和方法上的注解
- 根据注解转换成对应ip和端口
- 使用restTemplate进行调用