1. 程式人生 > 實用技巧 >SpringCloud04-Feign 負載均衡

SpringCloud04-Feign 負載均衡

Feign 負載均衡

簡介

feign是宣告式的web service客戶端,它讓服務之間的呼叫變得更簡單了,類似controller層呼叫service層,SpringCloud集成了Ribbon和Eureka,可在使用feign時提供負載均衡的http客戶端

只需要建立一個介面,然後添加註解即可!

feign主要是社群,大家都習慣面向介面程式設計,這個是很多開發人員的規範,呼叫微服務訪問的兩種方法

​ 1.微服務名字【Ribbon】

​ 2.介面和註釋【feign】

Feign能幹什麼?

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

​ 1)匯入依賴

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

​ 2)新增feign服務(介面)

package com.mjh.springcloud.service;

import com.mjh.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

@FeignClient(value = "SPRINGCLOUD-PRIVIDER-DEPT")
public interface DeptClientService {
    @GetMapping("/dept/add")
    public Dept addDept(Dept dept);
    @GetMapping("/dept/queryById/{id}")
    public Dept queryById(@PathVariable("id") Long id);
    @PostMapping("/dept/list")
    public Dept queryAll();
}

​ 3)讓客戶端呼叫feign介面

package com.mjh.springcloud.controller;

import com.mjh.springcloud.pojo.Dept;
import com.mjh.springcloud.service.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class DeptConsumerController {

    @Autowired
    private DeptClientService Service=null;

   @RequestMapping("/consumer/dept/add")
   public boolean add(Dept dept){
       return  this.Service.addDept(dept);
   }

    @RequestMapping("/consumer/dept/queryById/{id}")
    public Dept queryById(@PathVariable("id") Long id){
       //服務端給你什麼方法你就呼叫什麼方法
        return  this.Service.queryById(id);
    }

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return this.Service.queryAll();
    }
}

​ 4)把剛才寫的feign掃進來

@SpringBootApplication
@EnableEurekaClient  //Eureka客戶端
@EnableFeignClients(basePackages={"com.mjh.springcloud"})
@ComponentScan("com.mjh.springcloud")
public class FeignDeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(FeignDeptConsumer_80.class,args);
    }
}