环境:
IDEA JDK1.8 Spring Cloud Hoxton.M3 Spring Boot 2.2.0
一、Feign简介
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息,而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix。
总起来说,Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。
FeignClient注解的一些属性
- value:默认值为空字符串,主要作用调用服务名称,和name属性相同
- serviceId:默认值为空字符串,主要作用服务id,作用和name属性相同
- name:默认值为空字符串,主要作用调用服务名称,和value属性相同
- url:默认值为空字符串,主要作用全路径地址或hostname,Http或Https可选
- decode404:默认值为false,主要作用配置响应状态码为404时是否应该抛出FeignExceptions
- configuration:默认值为{},主要作用自定义当前feign client的一些配置
- fallback:默认值为void.class,主要作用熔断机制,调用失败时,回退方法,可以用来抛出异常或给出默认返回数据。
- path:默认值为空字符串,主要作用自动给所有方法的requestMapping前加上前缀,类似与controller类上的requestMapping
二、创建项目
1、File ----- New -----Project
2、Spring Initializr ----- Next
3、输入 Group 和 Artifact,点击 Next
4、选择Spring cloud Discovery -----Eureka Discovery Client---- Next
5、创建完成 点击 Finish 则在新窗口打开新建的工程
三、完善项目
1、由于刚刚创建的文件是初始化默认的项目,需要添加相应注解和配置文件。具体详情如下:
a.Eureka的依赖spring-cloud-starter-eureka <!-- spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> b.Feign的依赖spring-cloud-starter-feign <!-- spring-cloud-starter-feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> c.Web的依赖spring-boot-starter-web <!-- spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2、ClientserverApplication.java添加注解@EnableEurekaClient
3、完善配置文件application.properties 需要制定应用名称,应用名称为:Client_Server1
#服务的端口 server.port=8762 #注册到服务中心的地址 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #是否注册到eureka服务器, eureka.client.registerWithEureka=true #是否从eureka服务器获取注册信息 eureka.client.fetchRegistry=true #是否开启自我保护模式,默认为true。 eureka.server.enable-self-preservation=true #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) eureka.server.eviction-interval-timer-in-ms=10000 spring.application.name=Client-Server1
4、创建ClientController
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; /** * Created by 公众号:Java全栈架构师 */ @RestController public class ClientController { @RequestMapping("/test") // @ResponseBody public String test(@RequestParam String name){ return "Hello World!==port:8762==="+name; } }
四、运行项目
1、进入FeignclientserverApplication.java 启动类,右击选择Run
2、进入服务注册中心:
http://localhost:8761/ 显示服务已经注册成功(显示两个服务,是由于把其中一个复制了一下,修改端口号:8763,两个Feign项目所以就显示两个。)
3、输入http://localhost:8762/test?name=123
返回数据如下:
五、项目代码
1、pom.xml
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn.mcus</groupId> <artifactId>feignclientserver1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>feignclientserver</name> <description>Demo project for Spring Boot</description> <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>Hoxton.M3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</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> <!-- spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- spring-cloud-starter-feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <!-- spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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> </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> </repository> </repositories> </project>
2、application.properties文件
server.port=8762 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #是否注册到eureka服务器, eureka.client.registerWithEureka=true #是否从eureka服务器获取注册信息 eureka.client.fetchRegistry=true #是否开启自我保护模式,默认为true。 eureka.server.enable-self-preservation=true #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) eureka.server.eviction-interval-timer-in-ms=10000 spring.application.name=Client-Server1
3、ClientserverApplication.java
package cn.java; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * Created by 公众号:Java全栈架构师 */ @SpringBootApplication @EnableEurekaClient public class ClientserverApplication { public static void main(String[] args) { SpringApplication.run(ClientserverApplication.class, args); } }
4、Controller
package cn.scpro.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; /** * Created by 公众号:Java全栈架构师 */ @RestController public class ClientController { @RequestMapping("/test") // @ResponseBody public String test(@RequestParam String name){ return "Hello World!==port:8762==="+name; } }
以上就是一个Spring Cloud 的服务消费者(Feign)的创建过程。