集成Ribbon,Feign,和Hystrix


1.Ribbon,Feign的相關介紹

ribbon是負載均衡處理器,ribbon是屬於springcloud的一個組件,當我們微服務要通過注冊中心拉取到通信清單后,可以通過通信地址訪問其他微服務器,但如果其他微服務器做了集群的話,有多個微服務,我們到底訪問哪個微服務呢,如果都去訪問一個微服務的話,被訪問的微服務就會因為訪問的線程過多而出現服務器爆炸的可能,而其他服務器卻又閑置了,所以這是我們就需要負載均衡器幫我們處理這些請求,幫我們合理的分配這些請求,ribbon就是這個作用,ribbon默認的請求處理是輪詢,還有其他如隨機,一致性哈希,加權的方式實現請求分發。

feign也是負載均衡處理器,是基於ribbon的,Ribbon是一個基於 HTTP 和 TCP 客戶端 的負載均衡的工具。
它可以 在客戶端 配置 RibbonServerList(服務端列表),使用 HttpClient 或 RestTemplate 模擬http請求,步驟相當繁瑣。

而feign

Feign 是在 Ribbon的基礎上進行了一次改進,是一個使用起來更加方便的 HTTP 客戶端。
采用接口的方式, 只需要創建一個接口,然后在上面添加注解即可 ,將需要調用的其他服務的方法定義成抽象方法即可, 不需要自己構建http請求。
然后就像是調用自身工程的方法調用,而感覺不到是調用遠程方法,使得編寫 客戶端變得非常容易。

2.代碼實現ribbon步驟

1.導入依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

2.在返回restTemplate 的bean的方法上打上注解 @LoadBalanced,這個注解賦予了restTemplate有負載均衡的能力

@Configuration
public class BeanConfig {
    /**
     *   @LoadBalanced打了這個注解后restTemplate就有了ribbon的負載均衡能力
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

修改controller的調用方法 String url = "http://user-client/userclient/user/"+id,根據注冊中心的通信地址名user-client,訪問資源

@GetMapping("/order/{id}")
    public JsonResult queryById(@PathVariable Long id){
        //使用restTemplate發送http協議
        String url = "http://user-client/userclient/user/"+id;
        User user = template.getForObject(url, User.class);
        JsonResult jsonResult = new JsonResult();
        jsonResult.setData(user);
        return jsonResult;
    }

3.代碼實現feign的步驟

1.導入依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.編寫feign的接口

/**
 * 編寫feign的接口 user-client,注冊中心注冊的應用名
 */
@FeignClient(value = "user-client")
public interface UserFeignClient {
    /**
     * @PathVariable("id")這里面必須寫"id"不然注入不了這個UserFeignClient
     * @param id
     * @return
     * /userclient/user/{id},是服務器需要調用的服務器的資源路徑
     */
    @GetMapping("/userclient/user/{id}")
    User queryById(@PathVariable("id") Long id);
}

3.主配置類開啟feign@EnableFeignClients("cn.learn.springcloud.feignclient")

/**
 * @EnableFeignClients("cn.learn.springcloud.feignclient")主配置類開啟fenign
 */
@SpringBootApplication
@EnableFeignClients("cn.learn.springcloud.feignclient")
public class OrderClientApplication {

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

}

4.controller層注入接口,調用方法

@RestController
@RequestMapping("/orderclient")
public class UserController {
    @Autowired
    private UserFeignClient userFeignClient;
    @GetMapping("/order/{id}")
    public User queryById(@PathVariable Long id){
        //調用feign的接口的方法
        User user = userFeignClient.queryById(id);
        return user;
    }
}

3.Hystrix的相關介紹

hystrix是用來做熔斷機制的框架,也是屬於springcloud的組件,當我們的微服務通過注冊中心訪問其他微服務的時候,如果其他微服務掛掉了,訪問不到,那么會造成雪崩效應,引起其他服務器的癱瘓,這種一個微服務的癱瘓引起其他微服務的癱瘓的現象我們就稱它為雪崩效應,為了解決這個問題springcloud引入了熔斷機制hystrix幫我們解決這種問題,當一個服務器掛掉后,如果要訪問被掛掉的服務器,沒有訪問到,我們返回一個正常的友好的提示,告訴微服務,這個服務器出故障了,就像當於將這個掛掉的服務器隔離開,那么就不會引起要訪問的服務器的癱瘓了,保證了一個服務器掛掉,其他服務器正常運行。

3.1在ribbon中集成hystrix

1.導入依賴

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2.主配置類開啟熔斷機制@EnableCircuitBreaker

/**
 * @EnableCircuitBreaker開啟熔斷機制
 */
@SpringBootApplication
@EnableCircuitBreaker
public class OrderClientApplication {

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

}

3.以jsonResult的方式返回一個友好的提示,如果沒有訪問到服務的數據我們返回拖底方法的返回結果,方法上打注解@HystrixCommand(fallbackMethod = "getUserByIdFallback")

注意:托底方法的參數和返回結果要和原方法一致

@RestController
@RequestMapping("/orderclient")
public class UserController {
    @Autowired
    private RestTemplate template;
    /**
     * @HystrixCommand(fallbackMethod = "getUserByIdFallback"),打上拖底方法標簽
     * @param id
     * @return
     */
    @HystrixCommand(fallbackMethod = "getUserByIdFallback")
    @GetMapping("/order/{id}")
    public JsonResult queryById(@PathVariable Long id){
        //使用restTemplate發送http協議
        String url = "http://user-client/userclient/user/"+id;
        User user = template.getForObject(url, User.class);
        JsonResult jsonResult = new JsonResult();
        jsonResult.setData(user);
        return jsonResult;
    }
    /**
     * 降級方法,如果沒有訪問到user-client則返回方法中的拖底數據
     */
    public JsonResult getUserByIdFallback(@PathVariable Long id){
        JsonResult jsonResult = new JsonResult();
        jsonResult.setSuccess(false);
        jsonResult.setMsg("對不起服務器系統繁忙,請稍后再試");
        jsonResult.setData(null);
        return jsonResult;
    }
}

3.2在feign中集成hystrix

1.導入依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2.修改feign客戶端接口@FeignClient(value = "user-client",fallback = UserFeignClientFallback.class),fallback = UserFeignClientFallback.class表示訪問失敗后

調用UserFeignClientFallback這個類中的方法返回友好信息

3.編寫UserFeignClientFallback,實現feign的接口,覆寫feign接口中的方法(拖底實現)

@Component
public  class UserFeignClientFallback implements UserFeignClient {
    @Override
    public User queryById(Long id) {
        return new User(-1L,"對不起,服務器不可用",0);
    }
}

4.yml配置文件中啟用熔斷機制,feign默認是關閉熔斷機制的

ureka:
  client:
    serviceUrl:
      defaultZone: http://peer0:1000/eureka/,http://peer1:1001/eureka/
  instance:
    prefer-ip-address: true #定義ip到注冊中心注冊
    instance-id: order-client:2001
server:
  port: 2001
spring:
  application:
    name: order-client-2001
feign:
  hystrix:
    enabled: true #開啟熔斷支持


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM