第一种:

采用 RestTemplate + @LoadBalanced注解

 // 1. 编写配置类将RestTemplate 注册到spring容器中
 @Bean
 @LoadBalanced
 public RestTemplate restTemplate() {
     return new RestTemplate();
 }

 // 2.消费者调用 
 @GetMapping("/restTemplate")
 public String restTemplate() {
 	 // url 直接写生产者在nacos中注册的服务名称+方法名即可
     String result = restTemplate.getForEntity("http://server-member/getMember",String.class).getBody();
     return "restTemplate 方式获取会员服务结果:" + result;
 }

第二种:

采用 RestTemplate + LoadBalancerClient

// 1. 编写配置类将RestTemplate 注册到spring容器中
 @Bean
 public RestTemplate restTemplate() {
     return new RestTemplate();
 }

// 2. 消费者调用 
@GetMapping("/loadBalancerClient")
public String loadBalancerClient() {
	// 根据生产者在nacos中注册的服务名称本地通过负载均衡策略获取一个服务实例
    ServiceInstance serviceInstance = loadBalancerClient.choose("server-member");
    // 此时的url是最终访问服务器的ip+port
    String result = restTemplate.getForEntity(serviceInstance.getUri()+"/getMember",String.class).getBody();
    return "loadBalancerClient方式获取会员服务结果:" + result;
}

第三种:

采用@EnableFeignClients + @FeignClient

// 1. 启动类增加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class);
    }
}

// 2. 消费者编写MemberServiceFeign 接口(注意接口一定要和生产者的接口一致)
// value为生产者在nacos中注册的服务名称
@FeignClient(value = "server-member")
public interface MemberServiceFeign {

    @GetMapping("/getMember")
    String getMember(@RequestParam("id") Long id);
}

// 3.MemberServiceFeign 远程调用
@GetMapping("/memberRpc")
public String memberRpc() {
    String result = memberServiceFeign.getMember(10L);
    return "消费者调用会员服务接口返回结果:" + result;
}

注意:

上述的本地负载均衡都是Robin的默认轮训策略,以下列举Robin负载均衡实现类:

  • RoundRobinRule 轮询
  • RandomRule 随机
  • AvailabilityFilteringRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务列表进行轮询
  • WeightedResponseTimeRule 权重 根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。
  • RetryRule 重试 先按照轮询策略获取服务,如果获取失败则在指定时间内重试,获取可用服务
  • BestAvailableRule 选过滤掉多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • ZoneAvoidanceRule 符合判断server所在区域的性能和server的可用性选择服

指定默认的负载策略:

//配置类 将IRule 的实现类注册到spring容器中即可
@Bean
public IRule myRule(){
    // return new RoundRobinRule();//轮询
    // return new RetryRule();//重试
    // return new BestAvailableRule();
    // return new WeightedResponseTimeRule();// 权重
    return new RandomRule();
}

pom.xml

<dependencies>
        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <!-- 采用@FeignClient实现rpc调用时引用 -->
        <!--
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        -->
    </dependencies>

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐