Feign:

Feign 是一个声明式的 HTTP 客户端,它使得编写 HTTP 客户端变得更加简单和优雅。通过 Feign,开发者可以使用注解的方式来定义 HTTP 请求的参数、路径、方法等信息,而无需手动编写 HTTP 请求的代码。 Feign 可以与 Spring Cloud 中的服务发现组件(如 Eureka)集成,使得微服务之间的调用更加方便和透明。使用feign可以实现微服务之间的调用, Feign 是一个很好的微服务间通信的工具,但在复杂的网络环境下,如果发生故障,可能会导致调用失败。这时候就需要一个能够提供容错机制的组件来保障系统的可用性。


Hystrix:

Hystrix 是 Netflix 提供的一个用于处理分布式系统的延迟和故障的库。它实现了断路器模式,可以在服务之间进行通信时提供容错和隔离机制。 Hystrix 可以通过定义 fallback 方法来处理调用失败时的情况,使得系统在发生故障时能够进行优雅降级,而不至于影响整个系统的稳定性。 Hystrix 可以与 Feign 集成,通过 FeignClient 的 fallback 属性来指定 Hystrix 的降级逻辑,从而在微服务间通信时提供了容错机制。 因此,Feign 和 Hystrix 可以结合使用,通过 Feign 发起微服务间的 HTTP 调用,同时通过 Hystrix 提供的容错机制来保障系统的可用性和稳定性。这样,就可以在微服务架构中实现更加健壮的服务调用和容错处理。


因此,Feign 和 Hystrix 可以结合使用,通过 Feign 发起微服务间的 HTTP 调用,同时通过 Hystrix 提供的容错机制来保障系统的可用性和稳定性。这样,就可以在微服务架构中实现更加健壮的服务调用和容错处理。

具体的代码实现是在添加FeignClient注解的接口中,通过指定fallback属性为对应的降级类来实现容错处理。在降级类中,可以根据具体情况进行相应的处理,比如返回默认值或者抛出异常等。
1
2
3
4
5
6
7
8
9
@FeignClient(value = "eureka-client-ad-sponsor",
fallback = SponsorClientHystrix.class)
public interface SponsorClient {

@RequestMapping(value = "/ad-sponsor/get/adPlan",
method = RequestMethod.POST)
CommonResponse<List<AdPlan>> getAdPlans(
@RequestBody AdPlanGetRequest request);
}

Ribbon

Ribbon 是 Netflix 提供的一个负载均衡组件,它用于在客户端进行负载均衡,以提高微服务之间的通信效率和可靠性。
Ribbon 可以根据一定的负载均衡策略(如轮询、随机、权重等)来选择合适的服务实例进行请求转发,从而实现了对服务提供者的负载均衡。
在微服务架构中,服务消费者可以通过 Ribbon 来发起对服务提供者的请求,并且 Ribbon 可以根据负载均衡策略选择合适的服务实例进行请求转发。

微服务相互访问,通讯的协议应该是”http”,目前有两种常用的调用:

1.ribbon+spring restTemplate

2.feign(ribbon+hystrix) 声明式接口的形式

这两种也就是对 apache httpClient 的封装,方便微服务的使用吧。

Ribbon+Hystrix方式

1
2
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
artifactId>spring-cloud-starter-netflix-hystrix</artifactId>//断路器

配置eureka

注入 RestTemplate

1
2
3
4
5
6
7
8
9
10
11
12
13

@EnableEurekaClient //@EnableDiscoveryClient其他服务注册中心
@EnableHystrix //内部有@EnableCircuitBreaker
@SpringBootApplication
public class SearchApplication {
public static void main(String[] args) {SpringApplication.run(SearchApplication.class, args);}
//基于Ribbon实现微服务调用
@Bean
@LoadBalanced //开启默认Ribbon
RestTemplate restTemplate() {
return new RestTemplate();
}
}

服务调用

1
2
3
4
5
@HystrixCommand(fallbackMethod = "这里有断路器-例子")   //使用断路器
@PostMapping("/getAdPlansByRibbon") //Spring MVC 的controller
public CommonResponse<List<AdPlan>> getAdPlansByRibbon(@RequestBody AdPlanGetRequest request) {
return restTemplate.postForEntity("http://eureka-client-ad-sponsor/ad-sponsor/get/adPlan",
request, CommonResponse.class).getBody();}

Feign方式
坐标(简版) feign引入ribbon+hystrix等

1
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

配置eureka

启动类加上@EnableFeignClients

实现服务调用

1
2
3
4
5
@FeignClient(value = "eureka-client-ad-sponsor",fallback = SponsorClientHystrix.class)
public interface SponsorClient {
@RequestMapping(value = "/ad-sponsor/get/adPlan",method = RequestMethod.POST)
List<AdPlan> getAdPlans(@RequestBody AdPlanGetRequest request) throws AdException;
}

声明式的接口,外部直接调用方法就可以了,这个加了一个断路器SponsorClientHystrix

1
2
3
4
5
@Component
public class SponsorClientHystrix implements SponsorClient {
@Override
public List<AdPlan> getAdPlans(AdPlanGetRequest request) throws AdException {
throw new AdException(CodeMsg.EUREKA_CLIENT_AD_SPONSOR_ERROR);}