Feign的简单使用
Ribbon
其实ribbon只负责负载均衡,但是微服务之间通讯必须使用RestTemplate.但是这种方式不符合接口调用的规范,所以推荐使用feign(虽然feign比bibbon的开销稍大了一些).
Feign
Feign的简单配置
有一下几个点需要注意
- 在使用feign的同时是要使用eureka-client的,所以需要导入eureka-client的启动器.去maven中央仓库搜索eureka,他会让你使用spring-cloud-starter-netflix-eureka-client这个启动器.(不要用spring-cloud-starter-eureka这个启动器)
- 需要启动spring-boot-starter-web这个启动器,因为feign需要使用bibbon,而bibbon又需要RESTful通信,所以需要启动web的start
- 关于feign的依赖以前是spring-cloud-starter-feign(不要使用),但是maven中央仓库会让你使用spring-cloud-starter-openfeign这个starter.
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.userService</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>service project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<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-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</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>
<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>
</project>
application.properties
feign默认开启负载均衡
#用户服务提供者
server.port=25882
#向注册中心注册地址
eureka.register.url=http://127.0.0.1:25881/eureka
#在注册中心显示的名字
spring.application.name=userService
#开启熔断机制
feign.hystrix.enabled=true
#eureka配置,向服务中心eureka注册服务
eureka.client.service-url.defaultZone=${eureka.register.url}
#修改在注册中心的描述信息
eureka.instance.instance-id=userService-provider
info.app.name=userService
info.company.name=com.xh
启动类
@SpringBootApplication
@EnableEurekaClient//自动注册服务到服务中心
@EnableFeignClients//开启feign
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
feign远程调用
远程调用这块的坑很多
-
首先以前版本是不支持@GetMapping或者@PostMapping这两个标签的,需要使用@RequestMapping在里面写使用get还是post方法.
-
post方法不支持多参数传递,比如我下面写了一个String类型的mail和String类型的checkCode这是两个参数,如果使用post会报错无法启动.
-
每个参数前必须加@RequestParam("")不然也会报错.
-
我使用的版本对于int String这种参数是可以使用@GetMapping或者@PostMapping这两个标签的,但是如果参数是一个对象,就必须使用@RequestMapping并使用post方法.
@Component
@FeignClient(value = "MAILSERVICE", fallback = SendMailServiceFallback.class)
public interface SendMailService {
@GetMapping("/check")
boolean check(@RequestParam("mail") String mail, @RequestParam("checkCode") String checkCode);
@GetMapping("/sendCheckCode")
boolean sendCheckCode(@RequestParam("mail") String mail);
}
定义一个接口,声明需要使用的方法,开启Feign的客户端并在类上标注需要去eureka的那个服务中调用(vaule="服务名").
后面的fallback的作用就是熔断(防止服务雪崩),如果这个服务无法调用(默认请求超过50次会启动熔断),就去调用fallback后面的类方法.
并且这个类需要实现上面声明的接口
import com.userservice.feign.SendMailService;
import org.springframework.stereotype.Component;
@Component
public class SendMailServiceFallback implements SendMailService {
@Override
public boolean check(String mail, String checkCode) {
return false;
}
@Override
public boolean sendCheckCode(String mail) {
return false;
}
}
之后本服务调用远程服务就可以直接通过上面声明的接口直接使用.
在确保每个步骤都没有问题的情况下可以测试看看.另外远程调用的服务在上文中没有写出.步骤和这个服务基本一致,直接按照这个步骤来就可以,可以不使用feign或者hystrix.

浙公网安备 33010602011771号