微服务——服务负载均衡

x33g5p2x  于2021-10-25 转载在 其他  
字(3.6k)|赞(0)|评价(0)|浏览(438)

1.启动多个端口号服务

修改yml文件内的端口号,则可启动多个tomcat

2.负载均衡实现

2.1初级实现负载均衡

  • 注入LoadBalancerClient接口的依赖
  • LoadBalancerClient的对象负责从nacos服务中发现和获取服务实例
  • RibbonLoadBalancerClient为实现类,spring启动时会先去创建这个类的bean对象
    Controller层实现代码
/*此对象负责从nacos服务中发现和获取服务实例*/
    @Autowired
    private LoadBalancerClient loadBalancerClient;//RibbonLoadBalancerClient实现类
                                                  // spring启动时会先去创建这个类的bean对象
/*在doRestEcho1基础上实现了负载均衡*/
    @GetMapping("/concumer/doRestEcho2")
    public String doRestEcho2(){
        //获取provider服务实例 sca-provider为服务名
        ServiceInstance serviceInstance=loadBalancerClient.choose("sca-provider");
        String url=String.format("http://%s:%s/provider/echo/%s", serviceInstance.getHost(),
                serviceInstance.getPort(),appName);
        System.out.println(url);
        return restTemplate.getForObject(url,String.class);
    }

2.2 使用@LoadBalanced实现负载均衡

原理:发起远程调用时,底层会对这个请求进行拦截,会基于LoadBalancerClient对象获取服务实例,然后进行负载均衡方式的调用
启动类代码

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

Controller层代码

@Autowired
    private RestTemplate loadBalancedRestTemplate;
    @GetMapping("/concumer/doRestEcho3")
    public String doRestEcho3(){
// String url="http://sca-provider/provider/echo/"+appName;
        String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);
        return loadBalancedRestTemplate.getForObject(url, String.class);
    }

总结:

  • 1.此方法简化了基于loadBalancerClient获取服务实例信息的过程
  • 2.如何简化?为RestTemplate注入拦截器(SpringMVC中的拦截器),在底层拦截器中实现服务实例的获取
  • 3.如何为RestTemplate对象注入拦截器?RestTemplate对象构建时,使用@LoadBalanced注解进行描述

3.Feign

3.1概念

  • Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现

3.2 使用Feign步骤

3.2.1 导入依赖

<!--添加openfeign的依赖  封装了远程服务调用方式  以及错误处理机制-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

3.2.2 添加@EnableFeignClients注解

  • 位置:启动类上
  • 作用:告诉Spring框架对使用@FeignClient注解描述的接口创建实现类以及对象

3.2.3 创建接口RemoteProviderService

实现代码

package com.jt.concumer.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/*@FeignClient描述的接口,用于定义远程调用规范 * 其中name属性的值为远端服务名 同时也会把这个名字作为RemoveProviderService接口实现类Bean对象名字*/
@FeignClient(name="sca-provider")/*value也可以*/
public interface RemoteProviderService {
    @GetMapping("/provider/echo/{msg}")
    String echoMsg(@PathVariable("msg") String msg);
}
  • 问题:接口的方法上为什么要写@GetMapping?

  • Feign接口是基于方法上@GetMapping…注解中的value属性值来定义远程调用规范,后续会基于value值来调用远端服务的具体方法

3.2.4创建FeignConsumerController类

实现代码

package com.jt.concumer.controller;
import com.jt.concumer.service.RemoteProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/concumer")
public class FeignConsumerController {
    @Autowired
    private RemoteProviderService remoteProviderService;
    /**基于feign方式的服务调用 通过ribbon实现负载均衡 * 外界:http://localhost:8090/concumer/echo/aaa * */
    @GetMapping("/echo/{msg}")
    public String doFeignEcho(@PathVariable String msg){
        //基于feign方式进行远端服务调用(前提是服务必须存在)
        return remoteProviderService.echoMsg(msg);
    }
}

总结

  • 1.RestTemplate类的作用:通过此对象调用远端服务
  • 2.LoadBalancerClient作用:此对象负责从nacos服务中发现和获取服务实例
  • 3.@LoadBalanced作用:使用@LoadBalanced注解描述RestTemplate对象时, 发起远程调用时,底层会对这个请求进行拦截,会基于LoadBalancerClient对象获取服务实例,然后进行负载均衡方式的调用
  • 4.@EnableFeignClients作用:告诉Spring框架,要对使用@FeignClient注解描述的接口创建实现类以及对象
  • 5.@FeignClient作用:@FeignClient描述的接口,用于定义远程调用规范,其中name属性的值为远端服务名 同时也会把这个名字作为RemoveProviderService接口实现类Bean对象名字

相关文章