di注入LoadBalancerClient类实现负载均衡,借助@LoadBalanced注解实现RestTemplate的负载均衡

消费者服务发现及调用

1.导入依赖

		<dependencies>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    dependencies>

2.修改yml文件夹

server:
  port: 8090
spring:
  application:
    name: mu-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #从哪里去查找服务

3.创建消费服务

@SpringBootApplication
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class, args);
    }
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }//将RestTemplate对象交给spring容器管理,这样可以让在使用时new只会被调用一次
    @RestController
    public class ConsumerController{
        @Value("${spring.application.name:mu}")
        private String appName;
        @Autowired
        private RestTemplate restTemplate;
        @GetMapping("/consumer/doRestEcho1")
        public String doRestEcho01(){
            String url = "http://localhost:8081/provider/echo/"+appName;
            return restTemplate.getForObject(url, String.class);
        }
    }
}

4.启动消费者服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1地址进行访问,假如访问成功会出现,如图所示效果:

服务负载均衡设计及实现

1.修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法,然后进行服务访问.


  @Autowired
  private LoadBalancerClient loadBalancerClient;
   
  @GetMapping("/consumer/doRestEcho02")
 public String doRestEcho02(){
     ServiceInstance serviceInstance = loadBalancerClient.choose("mu-provider");
     String url = String.format("http://%s:%s/provider/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
     System.out.println("request url:"+url);
     return restTemplate.getForObject(url, String.class);
     }
 }

2.修改provider中yml文件的端口号,开启多个provider服务,模拟负载均衡如果开启成功则
di注入LoadBalancerClient类实现负载均衡,借助@LoadBalanced注解实现RestTemplate的负载均衡_第1张图片3.反复访问

http://localhost:8090/consumer/doRestEcho02

这里多个实例并发提供服务的方式为负载均衡,这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。

@LoadBalanced

当使用RestTemplate进行远程服务调用时,假如需要负载均衡,可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建RestTemplate对象:

    @Bean
    @LoadBalanced
    public RestTemplate restTemplateloadBalancerClient(){
        return new RestTemplate();
    }

在需要RestTemplate实现负载均衡调用的地方进行依赖注入.例如在ConsumerController类中添加restTemplateloadBalancerClient属性

@Autowired
private RestTemplate restTemplateloadBalancerClient;

可以在对应服务端调用方的方法内,基于RestTemplate借助服务器名进行调用

        @Autowired
        private RestTemplate restTemplateloadBalancerClient;
        @GetMapping("/consumer/doRestEch03")
        public String doRestEcho03(){
            String url=String.format("http://%s/provider/echo/%s","mu-provider",appName);
            //向服务提供方发起http请求,获取响应数据
            return restTemplateloadBalancerClient.getForObject(
                    url,//要请求的服务的地址
                    String.class);//String.class为请求服务的响应结果类型
        }

@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。

小节面试分析

  • @Bean注解的作用?(一般用于配置类内部,描述相关方法,用于告诉spring此方法的返回值要交给spring管理,bean的名字默认为方法名,假如需要指定名字可以@Bean(“bean的名字”),最多的应用场景是整合第三方的资源-对象)
  • @Autowired注解的作用?(此注解用于描述属性,构造方法,set方法等,用于告诉spring框架,按找一定的规则为属性进行DI操作,默认按属性,方法参数类型查找对应的对象,假如只找到一个,则直接注入,类型多个时还会按照属性名或方法参数名进行值的注入,假如名字也不同,就出报错.)
  • Nacos中的负责均衡底层是如何实现的?(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
  • Ribbon 是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)
  • Ribbon 可以解决什么问题? (基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口)
  • Ribbon 内置的负载策略都有哪些?(8种,可以通过查看IRule接口的实现类进行分析)
  • @LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。)
  • 我们可以自己定义负载均衡策略吗?(可以,基于IRule接口进行策略定义,也可以参考NacosRule进行实现)

你可能感兴趣的:(微服务实践,java,spring)