前言:
之前写了通过Ribbon+RestTemplate实现调用服务,此处我再系统的说一下两者的区别
一、springcloud的负载均衡策略
1、Ribbon
是基于Netflix Ribbon实现的一套客户端 负载均衡的工具,类似Nginx主要功能时提供客户端的软件负载均衡算法LB就是负载均衡,集中式(F5),进程内(Nginx),消费者可以自动看从Eureka中拿到对应的服务列表,默认进行轮询RoundRobinRule
下图是RestTemplate的自带的7中均衡策略
我们在之前通过Ribbon+RestTemplate实现调用服务的时候,在获取RestTemplate的方法上加了@LoadBalanced ,实现默认轮询,如果需要更改其均衡策略,则在配置类中声明想要的均衡策略
具体实现参考:https://www.cnblogs.com/guanyuehao0107/p/11819375.html
@Configuration public class RestConfig { @Bean //通过RestTemplate来实现调用接口 @LoadBalanced //表示RestTemplate开启了负载均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); } //重新创建一个均衡策略,表示不使用默认 @Bean public IRule getIReule(){ //通过获取一个IRule对象, return new RandomRule(); //达到的目的,用我们重新选择的随机,替代默认的轮训方式 } }
2、消费者controller层
//声明一个接口 // private static final String HTTP_NAME = "http://localhost:8001/product/"; private static final String HTTP_NAME = "http://MICROSERVICE-PRODUCT"; @Autowired private RestTemplate restTemplate; @Resource private DiscoveryClient client; //我这个微服务想要被别人去发现 @GetMapping("/consum/find/{id}") public User findone(@PathVariable("id")Integer id){ String url = HTTP_NAME+"/product/findone/"+id; return (User) restTemplate.getForObject(url,User.class); } @GetMapping("/consum/findAll") public List<User> getAll(){ List<User> users = restTemplate.getForObject(HTTP_NAME + "/product/list", List.class); return users; }
2、Fegin的配置
Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,在api层只需要创建一个接口,然后在上面添加注解即可
步骤如下:
1、导入依赖,创建接口的微服务,以及消费者微服务都需要引入
<!-- Feign依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.0.RELEASE</version> </dependency>
2、创建消费者层
@RestController public class Usercontroller {
@Resource //调用的是API层的接口 private UserService userService;
@GetMapping("/consum/find/{id}") public User findone(@PathVariable("id")Integer id){ return userService.findById(id); } @GetMapping("/consum/findAll") public List<User> getAll(){ return userService.findAll(); } }
3、在消费者的模块的启动类上加上 @EnableFeignClients(basePackages = {"com.ghh"}) //扫描另外一个Feign的接口
@SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = {"com.ghh"}) //扫描另外一个Feign的接口 public class ConsumStart_Feign { public static void main(String[] args) { SpringApplication.run(ConsumStart_Feign.class,args); } }
4、在api层要创建一个接口,以及加上一个注解@FeignClient(value = "MICROSERVICE-PRODUCT"),表名调用的提供者或者服务名称
@FeignClient(value = "MICROSERVICE-PRODUCT") public interface UserService { @GetMapping("/product/findone/{id}") public User findById(@PathVariable("id") Integer id); @GetMapping("/product/list") public List<User> findAll(); }
三、Ribbon+RestTemplate和Feign的区别
1、实际开发中,对服务依赖的调用可能不止一处,往往一个接口会被多处调用,如果使用Ribbon+RestTemplate,就需要在每一个模块都要创建一个配置类,而且,各社区中javaweb也倾向于面向接口编程
2、通常针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用,所以,Feign在此基础上做了进一步封装,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),完成对服务提供方的接口绑定
3、使用Feign是通过接口的方法调用Rest服务,该请求发送给Eureka服务器,通过Feign直接找到服务接口。Feign融合了Ribbon技术,所以也支持负载均衡。