Aeizzz / aeizzz

0 stars 2 forks source link

Spring Cloud 之 Feign or Ribbon #3

Open Aeizzz opened 6 years ago

Aeizzz commented 6 years ago

在上面的教程中,已经完成了注册中心的搭建,那么我们如何去消费注册中心的服务呢

Ribbon

Ribbon使用

Ribbon是一个基于HTTP和TCP客户端的负载均衡器。Feign中也使用Ribbon,后续会介绍Feign的使用。

Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。

当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。

下面我们通过实例看看如何使用Ribbon来调用服务,并实现客户端的均衡负载。

在应用主类中,通过@EnableDiscoveryClient注解来添加发现服务能力。创建RestTemplate实例,并通过@LoadBalanced注解开启均衡负载能力。

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }

}

创建一个Controller来消费A的add服务。通过直接RestTemplate来调用服务。并且需要将服务注册到注册中心,示例如下:

@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add() {
        return restTemplate.getForEntity("http://A/add?a=10&b=20", String.class).getBody();
    }

}

断路器使用

在主类中添加@EnableCircuitBreaker注解开启断路器功能:

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class RibbonApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }

}

改造原来的服务消费方式,在使用ribbon消费服务的函数上增加@HystrixCommand注解来指定回调方法。

@Service
public class AService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "addServiceFallback")
    public String addService() {
        return restTemplate.getForEntity("http://A/add?a=10&b=20", String.class).getBody();
    }

    public String addServiceFallback() {
        return "error";
    }

}

Feign

Feign使用

Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单。我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。它具备可插拔的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插拔的编码器和解码器。Spring Cloud为Feign增加了对Spring MVC注解的支持,还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

下面,通过一个例子来展现Feign如何方便的声明对上述服务的定义和调用。

假设所有服务注册到了Eureka服务中,若服务it-ui需要调用it-admin 的服务。

首先在it-ui模块中添加接口,如DictService,在Service上添加注解@FeignClient,然后在接口的方法上利用Spring MVC的注解就可以完成对it-admin服务的调用。

@FeignClient中填写的参数是注册到eureka注册中心的服务名称。 @RequestMapping中的路径是被调用服务的controller地址。

@FeignClient("it-admin")
public interface DictService {

    @RequestMapping(value = "/sysDict/get/{id}", method = RequestMethod.GET)
    Result getDictById(@PathVariable("id") String id);

    @RequestMapping(value = "/sysDict/list/{pageNo}/{pageSize}", method = RequestMethod.GET)
    Result<Page> pageDict(@PathVariable("pageNo") Integer pageNo, @PathVariable("pageSize") Integer pageSize);

    @RequestMapping(value = "/sysDict/save", method = RequestMethod.POST)
    Result saveDict(@RequestBody SysDictDto dto);

    @RequestMapping(value = "/sysDict/delete/{ids}", method = RequestMethod.DELETE)
    Result deleteDictByIds(@PathVariable("ids") String ids);

    @RequestMapping(value = "/sysDict/findByType", method = RequestMethod.GET)
    List getDictByType(@RequestParam("type") String type);

    @RequestMapping(value = "/sysDict/findByValue", method = RequestMethod.GET)
    SysDict getDictByValue(@RequestParam("type") String type, @RequestParam("value") String value);

    @RequestMapping(value = "/sysDict/findByLable", method = RequestMethod.GET)
    SysDict getDictByLabel(@RequestParam("type") String type, @RequestParam("label") String label);
}

Feign断路器使用

在原有@FeignClient("it-admin")的注解中添加属性 @FeignClient(value = "it-admin-service", fallback = AdminServiceFallBack.class) 当服务调用失败后,会调用fallback中指定类的方法

@Service
public class AdminServiceFallBack implements DictService  {

    //...................省略接口实现..................

}

详细使用,可查看官方文档。文档