SpringCloud-4-Feign

Feign

1. Feign概述

feign是聲明式的web service客戶端,它讓微服務之間的調用變得更簡單了,相似controller調用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign時提供負載均衡的http客戶端java

Feign本質上是對Ribbon作了集成封裝, 至關於加了一層, 更加符合開發者面向接口和註解的編程習慣, 免去了RestTemplate的配置, 這樣同時不可避免的帶來了性能的損失web

2. 使用Feign作負載均衡

1. 建立Feign客戶端

在API中提供Feign的接口spring

1. 導入依賴

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

2. 建立Feign接口

image-20201012141120672

package com.wang.springcloud.service;

import com.wang.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
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;

//value爲微服務的名稱
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
@Service
public interface DeptClientService {

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

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

    @PostMapping("/dept/add")
    Boolean addDept(Dept dept);

}

注意編程

  • @FeignClient 聲明該接口爲Feign的客戶端, value指定了用於負載均衡的服務名
  • 接口中的方法的url對應provider中提供的url, 本質上與Ribbon同樣, 只是這裏省略了繁瑣的RestTemplate配置, 經過註解直接寫在此處

2. 調用Feign

1. 導入依賴

咱們首先依據SpringCloud-consumer-dept-8080建立了利用Feign作負載均衡的Moduleapp

image-20201012141635784

一樣的, 依賴只須要將Ribbon替換爲Feign負載均衡

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

2. 在controller中調用Feign

package com.wang.springcloud.controller;

import com.wang.springcloud.pojo.Dept;
import com.wang.springcloud.service.DeptClientService;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
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.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@ApiModel("Consumer Controller")
@RestController
public class DeptConsumerController {

    @Autowired
    private DeptClientService service = null;

    @ApiOperation("經過部門編號查詢一個部門")
    @RequestMapping(value = "/consumer/dept/get/{id}", method = RequestMethod.GET)
    public Dept get(@PathVariable("id") @ApiParam("部門編號") Long id) {
        return this.service.queryById(id);
    }

    @ApiOperation("經過部門名稱添加一個部門")
    @RequestMapping(value = "/consumer/dept/add", method = RequestMethod.POST)
    public boolean add(@ApiParam("部門的名稱") Dept dept){
        return this.service.addDept(dept);
    }

    @ApiOperation("查詢所有的部門")
    @RequestMapping(value = "consumer/dept/list", method = RequestMethod.GET)
    public List<Dept> list() {
        return this.service.queryAll();
    }

}

注意dom

  • 咱們要使用Feign客戶端, 所以要將API定義的Feign客戶端自動裝配, 引入controller中
  • 調用的時候, 咱們只須要返回API接口中對應的方法便可

3. 在主啓動類聲明

package com.wang.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

//Ribbon 和 Eureka 整合之後, 客戶端能夠直接調用, 不用關心IP地址和端口號
@SpringBootApplication
@EnableEurekaClient
//開啓Feign客戶端支持
@EnableFeignClients
public class FeignDeptConsumer_8080 {
    public static void main(String[] args) {
        SpringApplication.run(FeignDeptConsumer_8080.class, args);
    }
}

3. 關於Feign負載均衡策略的一些思考

Feign因爲封裝了Ribbon, 只是更加貼近JAVA的面向接口和註解編程的習慣, 所以, 自定義和更改負載均衡策略與Ribbon一致, 依然是註冊IRule接口ide

當自定義策略與SpringBoot主啓動類不在同一級時, 使用@RibbonClient註解中的configuration屬性指定配置類微服務

下面是在Feign配置負載均衡黑隨機方式的配置類性能

package com.wang.springcloud.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {

    @Bean
    public IRule myRule() {
        return new RandomRule();
    }

}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息