Feign講解應用

Feignjava


Feign[feɪn]mysql

什麼是Feign?

Feign 的英文表意爲「僞裝,假裝,變形」, 是一個http請求調用的輕量級框架,能夠以Java接口註解的方式調用Http請求,而不用像Java中經過封裝HTTP請求報文的方式直接調用。Feign經過處理註解,將請求模板化,當實際調用的時候,傳入參數,根據參數再應用到請求上,進而轉化成真正的請求,這種請求相對而言比較直觀。 Feign被普遍應用在Spring Cloud 的解決方案中,是學習基於Spring Cloud 微服務架構不可或缺的重要組件。 它讓微服務之間調用變得更簡單了, 相似controller調用service. SpringCloud集成了Ribbon Eureka, 能夠在使用Feign時提供 負載均衡 的客戶端git

只須要一個接口, 而後添加註解便可github

feign主要是社區, 你們都習慣面向接口編程. 這是不少開發人員的規範. 調用微服務有兩種方法web

  • 微服務名字(ribbon)
  • 接口和註解(feign)

Feign能幹什麼

  • Feign旨在編寫Java Http客戶端變得更容易
  • 前面使用Ribbon + RestTemplate時, 利用RestTemplate對Http請求的封裝處理, 造成了一套模塊化用法. 可是實際開發中, 因爲服務的依賴的調用可能不止一處, 每每一個接口會被多處調用, 因此都會針對每個服務自行封裝一些客戶端類來包裝這些依賴服務的調用. 因此Feign在此基礎上作了進一步封裝, 由他來幫助咱們定義和實現依賴服務接口的定義, **在Feign的實現下, 咱們只須要建立一個接口並使用註解的方式來配置它(相似於之前Dao接口上標註@Mapper註解, 如今是一個微服務接口上面標註一個Feign註解便可.) 便可完成對服務同提供方的接口綁定, 簡化了使用SpringCloud Ribbon時, 自動封裝服務調用客戶端的開發量

使用feign 就是代替 RestTemplatespring

具體實現

實體類項目 加入 接口(和註解)

項目結構 sql

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>cn.com.codingce</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-api</artifactId>

    <dependencies>
        <!--當前module本身須要的依賴, 若是父依賴中已經配置了版本-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--junit-->
<!--        <dependency>-->
<!--            <groupId>junit</groupId>-->
<!--            <artifactId>junit</artifactId>-->
<!--        </dependency>-->

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>

    </dependencies>
</project>
複製代碼

DeptClientService

package cn.com.codingce.service;

import cn.com.codingce.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
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;

/**
 * @author xzMa
 *
 * feign(面向接口編程)    練習  在實體類項目 建立service包  並建立 DeptClientService接口
 *
 *
 * 調用微服務兩種方式 1 微服務名字 ribbon   2 接口和註解 feign
 *
 *
 * 只須要 接口和註解
 *
 * 註解
 */

@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);

}
複製代碼

新建客戶端項目(springcloud-cusumer-dept-feign)

項目結構 apache

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>cn.com.codingce</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <description>也是用來作客戶端的</description>
    <artifactId>springcloud-cusumer-dept-feign</artifactId>

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

        <!--咱們須要拿到實體類, 因此要配置api -module-->
        <dependency>
            <groupId>cn.com.codingce</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--熱部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--Ribbon-->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

        <!--Eureka  客戶端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
    </dependencies>
</project>
複製代碼

DeptConsumerController

package cn.com.codingce.springcloud.controller;

import cn.com.codingce.pojo.Dept;
import cn.com.codingce.service.DeptClientService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
public class DeptConsumerController {

    @Resource
    private DeptClientService deptClientService = null;

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

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return this.deptClientService.queryById(id);
    }

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

}
複製代碼

ConfigBean(配置Ribbon)

package cn.com.codingce.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 {   //configuration -- spring applicationContext.xml

    //配置負載均衡實現RestTemplate  @LoadBalanced
    //IRule
    //AvailabilityFilteringRule: 先會過濾掉, 跳閘, 訪問故障服務器
    //RoundRobinRule    輪詢
    //RandomRule    隨機
    //RetryRule: 會按照輪詢獲取服務~ 若是服務獲取失敗, 則會在指定的時間內進行, 重試
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }


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

}
複製代碼

啓動類FeginDeptConsumer_80

package cn.com.codingce.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;
import org.springframework.context.annotation.ComponentScan;

/**
 * @author xzMa
 * 在微服務啓動的時候就能加載咱們自定義的Ribbon類
 */

@SpringBootApplication
@EnableEurekaClient //Eureka 客戶端
@EnableFeignClients(basePackages = {"cn.com.codingce"})
@ComponentScan("cn.com.codingce")
public class FeginDeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(FeginDeptConsumer_80.class, args);
    }
}
複製代碼

操做截圖

本項目地址: https://github.com/xzMhehe/codingce-java 開源項目地址: https://github.com/OpenFeign/feign編程

相關文章
相關標籤/搜索