什么是Feign?
Feign是受到Retrofit,JAXRS-2.0和WebSocket的影响,它是一个java的到http客户端绑定的开源项目。
Feign的主要目标是将Java Http 客户端变得简单。
推荐博客:
Feign的源码地址:https://github.com/OpenFeign/feign
<https://github.com/OpenFeign/feign>
深入理解Feign之源码解析:https://blog.csdn.net/forezp/article/details/73480304
<https://blog.csdn.net/forezp/article/details/73480304>
常见错误:
1、Spring Cloud服务消费者使用Feign,不识别@EnableFeignClients 注解解决办法
查阅资料后是Spring
Cloud对Feign的支持由org.springframework.cloud:spring-cloud-netflix-core 移到org.springframework.cloud:spring-cloud-openfeign-core下。
报错信息:cannot resolve sysmol EnableFeignClients
解决方案:
更改Spring Cloud的版本Finchley.RC2换为Dalston.RC1由于Finchley.RC2使用需要Spring
Boot2.0,这里需要把Spring Boot版本换到1.5即可
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version> <type>pom</type> <scope>import</scope>
</dependency> </dependencies>
一、建立服务消费者
1、项目建立可参考上一篇博客:https://blog.csdn.net/zjh_746140129/article/details/80557302
<https://blog.csdn.net/zjh_746140129/article/details/80557302>
2、项目pom.xml 新增
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId> </dependency>
完整pom.xml
<?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">
<modelVersion>4.0.0</modelVersion> <groupId>com.serverfeign</groupId>
<artifactId>serverfeign</artifactId> <version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>serverfeign</name> <description>Demo project
for Spring Boot</description> <!--<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version> <relativePath/> <!– lookup parent from
repository –> </parent>--> <parent> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from
repository --> </parent> <!--<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RC2</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency> <dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <scope>test</scope>
</dependency> </dependencies>--> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> </properties> <dependencies> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <scope>test</scope>
</dependency> </dependencies> <dependencyManagement> <!--<dependencies>
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version> <type>pom</type>
<scope>import</scope> </dependency> </dependencies>--> <dependencies>
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version> <type>pom</type> <scope>import</scope>
</dependency> </dependencies> </dependencyManagement> <build> <plugins>
<plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
<repositories> <repository> <id>spring-milestones</id> <name>Spring
Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots>
<enabled>false</enabled> </snapshots> </repository> </repositories> </project>
3、编写服务消费Service和Controller
通过@ FeignClient(“服务名”),来指定调用哪个服务
package com.serverfeign.serverfeign.service; import
org.springframework.cloud.netflix.feign.FeignClient; import
org.springframework.web.bind.annotation.RequestMapping; import
org.springframework.web.bind.annotation.RequestMethod; import
org.springframework.web.bind.annotation.RequestParam; /** *
通过@FeignClient(“服务名”),来指定调用哪个服务 * Created by zhoujh on 2018/6/04 */
@FeignClient(value = "hello-service") public interface HelloService {
@RequestMapping(value = "/hi",method = RequestMethod.GET) String
sayHiFromClientOne(@RequestParam(value = "name") String name); }
package com.serverfeign.serverfeign.controller;
import com.serverfeign.serverfeign.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping(value = "/hi",method = RequestMethod.GET)
@ResponseBody
public String HiFeign(@RequestParam String name){
return helloService.sayHiFromClientOne(name);
}
}
4、修改配置文件
server.port=8765 spring.application.name=service-feign
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
5、修改启动类
在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能
package com.serverfeign.serverfeign; import
org.springframework.boot.SpringApplication; import
org.springframework.boot.autoconfigure.SpringBootApplication; import
org.springframework.cloud.client.discovery.EnableDiscoveryClient; import
org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class
ServerfeignApplication { public static void main(String[] args) {
SpringApplication.run(ServerfeignApplication.class, args); } }
二、启动服务注册中心、服务提供者(2个)、服务消费者(Feign)
三、刷新消费者,查看服务提供者后台打印,此时已经完成了消费的负载均衡(这里采用了轮询策略)
Spring Boot与Spring Cloud学习使用可参看笔者博客
①Spring Cloud入门教程之服务注册与发现Eureka
<https://blog.csdn.net/zjh_746140129/article/details/80557302>
②Spring Cloud入门教程之服务消费者 Ribbon
<https://blog.csdn.net/zjh_746140129/article/details/80560841>
③Spring Cloud入门教程之服务消费者 Feign
<https://blog.csdn.net/zjh_746140129/article/details/80573571>
④Spring Cloud入门教程之断路器 Hystrix
<https://blog.csdn.net/zjh_746140129/article/details/80588584>
⑤Spring Cloud入门教程之断路由网关 Zuul
<https://blog.csdn.net/zjh_746140129/article/details/80630849>
⑥Spring Cloud入门教程之分布式配置中心 Spring Cloud Config
<https://blog.csdn.net/zjh_746140129/article/details/80632087>
⑦idea下新建Spring Boot项目并配置启动
<https://blog.csdn.net/zjh_746140129/article/details/80101122>
⑧Spring Boot无法自动注入bean问题解决方案
<https://blog.csdn.net/zjh_746140129/article/details/80156223>
⑨idea 设置Spring Boot热部署
<https://blog.csdn.net/zjh_746140129/article/details/80217497>
热门工具 换一换