一、Feign简介

  • Feign是一个声明式的伪Http客户端
  • 使用Feign,只需要创建一个接口并注解
  • 有可插拔的注解特性,使用Feign 注解和JAX-RS注解
  • Feign支持可插拔的编码器和解码器
  • Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果
  • 整合了Hystrix,具有熔断的能力

二、准备工作

 启动eureka-server,端口为8761; 启动service-hi 两次,端口分别为8762 、8773.

新建一个父工程与第一节相同建一个spring-boot工程,取名为serice-feign,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign、Eureka的起步依赖spring-cloud-starter-netflix-eureka-client、Web的起步依赖spring-boot-starter-web,代码如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
 
    <groupId>com.forezp</groupId> 
    <artifactId>service-feign</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>service-feign</name> 
    <description>Demo project for Spring Boot</description> 
 
    <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>2.0.3.RELEASE</version> 
    </parent> 
 
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-web</artifactId> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework.cloud</groupId> 
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework.cloud</groupId> 
            <artifactId>spring-cloud-starter-openfeign</artifactId> 
        </dependency> 
 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-test</artifactId> 
            <scope>test</scope> 
            <exclusions> 
                <exclusion> 
                    <groupId>org.junit.vintage</groupId> 
                    <artifactId>junit-vintage-engine</artifactId> 
                </exclusion> 
            </exclusions> 
        </dependency> 
    </dependencies> 
 
 
 
</project>

在工程的配置文件application.yml文件,指定程序名为service-feign,端口号为8765,服务注册地址为http://localhost:8761/eureka/ ,代码如下:

server: 
  port: 8765 
 
spring: 
  application: 
    name: service-feign 
 
eureka: 
  client: 
    serviceUrl: 
      defaultZone: http://localhost:8761/eureka/

在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能:

package com.forezp.servicefeign; 
 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 
import org.springframework.cloud.openfeign.EnableFeignClients; 
 
@SpringBootApplication 
@EnableEurekaClient 
@EnableDiscoveryClient 
@EnableFeignClients 
public class ServiceFeignApplication { 
 
    public static void main(String[] args) { 
        SpringApplication.run(ServiceFeignApplication.class, args); 
    } 
 
}

定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了service-hi服务的“/hi”接口,代码如下:

 
package com.forezp.servicefeign.service; 
 
import org.springframework.cloud.openfeign.FeignClient; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
 
/** 
 * @Auther: chengmr 
 * @Date: 2020/6/23 14:41 
 * @Description: 
 */ 
@FeignClient(value = "service-hi") 
public interface SchedualServiceHi { 
 
    @RequestMapping(value = "/hi",method = RequestMethod.GET) 
    String sayHiFromClientOne(@RequestParam(value = "name") String name); 
}

在Web层的controller层,对外暴露一个”/hello”的API接口,通过上面定义的Feign客户端SchedualServiceHi 来消费服务。代码如下:

package com.forezp.servicefeign.controller; 
 
import com.forezp.servicefeign.service.SchedualServiceHi; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 
 
/** 
 * @Auther: chengmr 
 * @Date: 2020/6/23 14:43 
 * @Description: 
 */ 
@RestController 
public class HiController { 
    //编译器报错,无视。 因为这个Bean是在程序启动的时候注入的,编译器感知不到,所以报错。 
    @Autowired 
    SchedualServiceHi schedualServiceHi; 
 
    @RequestMapping("/hello") 
    public String sayHi(@RequestParam String name){ 
        return schedualServiceHi.sayHiFromClientOne(name); 
 
    } 
}

启动程序,多次访问http://localhost:8765/hello?name=forezp,浏览器交替显示:

源码下载:IT虾米网


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!