SpringCloudAlibaba-负载均衡和远程调用

113 阅读1分钟

负载均衡 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

如果服务下有多个地址,多次刷新显示不同的端口

image.png

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;
}

实现原理

  1. @EnableFeignClients会扫描加了@FeignClient注解的类
  2. 会运用动态代理技术和反射,获取到类和方法上的注解
  3. 根据注解转换成对应ip和端口
  4. 使用restTemplate进行调用