1. 程式人生 > 其它 >Feign-負載均衡

Feign-負載均衡

技術標籤:SpringCloud

文章目錄

一.概念

1.Feign是什麼?

Feign是一種負載均衡的HTTP客戶端, 使用Feign呼叫API就像呼叫本地方法一樣,從避免了呼叫目標微服務時,需要不斷的解析/封裝json 資料的繁瑣。Feign集成了Ribbon。Ribbon+eureka是面向微服務程式設計,而Feign是面向介面程式設計。

Fegin是一個宣告式的web服務客戶端,它使得編寫web服務客戶端變得更加容易。使用Fegin建立一個介面並對它進行註解。它具有可插拔的註解支援包括Feign註解與JAX-RS註解,Feign還支援可插拔的編碼器與解碼器,Spring Cloud 增加了對 Spring MVC的註解,Spring Web 預設使用了HttpMessageConverters, Spring Cloud 整合 Ribbon 和 Eureka 提供的負載均衡的HTTP客戶端 Feign。

2.Feign有什麼作用?

Feign旨在使編寫Java Http客戶端變得更容易。在使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模版化的呼叫方法。但是在實際開發中,由於對服務依賴的呼叫可能不止一處,往往一個介面會被多處呼叫,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的呼叫。所以,Feign在此基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務介面的定義。在Feign的實現下,我們只需建立一個介面並使用註解的方式來配置它(以前是Dao介面上面標註Mapper註解,現在是一個微服務介面上面標註一個Feign註解即可),即可完成對服務提供方的介面繫結,簡化了使用Spring cloud Ribbon時,自動封裝服務呼叫客戶端的開發量。

Feign集成了Ribbon。利用Ribbon維護了MicroServiceCloud-Dept的服務列表資訊,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過feign只需要定義服務繫結介面且以宣告式的方法,優雅而簡單的實現了服務呼叫。

二.如何使用Feign?

1.在service處和feign消費者端引入依賴

        <!-- feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <
artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.7.RELEASE</version> </dependency>

2.Feign配置類

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.sise"})
@ComponentScan("com.sise")
public class FeignDeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(FeignDeptConsumer_80.class,args);
    }
}

3.建立service層(介面+註解)

@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {

    @GetMapping("/dept/get/{id}")
    public Dept queryById(@PathVariable("id") Long id);

    @GetMapping("/dept/list")
    public List<Dept> queryAll();

    @PostMapping("/dept/add")
    public boolean addDept(Dept dept);

}

4.controller服務呼叫介面

以前使用Ribbon+Eureka時:

@RestController
public class DeptConsumerController {

    //消費者不應該有service層
    //我們可以使用restTemplate直接呼叫

// 請求地址 http://localhost:8001/dept/get/1
/*
    Ribbon。我們這裡的地址應該是一個變數,通過服務名來訪問
    private static final String REST_URL_PREFIX="http://localhost:8001";
*/
private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-DEPT";

    //提供多種便捷訪問遠端http服務的方法
    @Autowired
    private RestTemplate restTemplate;
    
    //呼叫服務提供者的add方法
    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    //呼叫服務提供者的get方法
    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }

    //呼叫服務提供者的list方法
    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }
}

現在使用Feign,面向介面程式設計:

@RestController
public class DeptConsumerController {

    @Autowired
    private DeptClientService service=null;

    //呼叫服務提供者的add方法
    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        return this.service.addDept(dept);
    }

    //呼叫服務提供者的get方法
    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return this.service.queryById(id);
    }

    //呼叫服務提供者的list方法
    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return this.service.queryAll();
    }
}

5.效果

在這裡插入圖片描述