目前在SpringCloud技术栈中,调用服务用得最多的就是OpenFeign,使用OpenFeign调用微服务中其他服务的接口,使用Eureka或Nacos作为注册中心,具体配置如下:
1. 在启动类中添加以下注解:
@SpringBootApplication
@EnableDiscoveryClient
public class OpenFeignServer {
public static void main(String[] args) {
SpringApplication.run(启动类的名字.class, args);
}
}
2. 在 pom.xml 中添加以下依赖:
org.springframework.cloud
spring-cloud-starter-openfeign
3. yml配置内容如下:
配置名称和注册到Eureka或Nacos上面的名字要一致,例如我注册的名字是 openfeign-server,在yml里也配置这个名字。
#这个yml是你要调用的微服务的配置
spring:
application:
name: 你的项目名称(自定义)例如:openfeign-server
1. 新建软件包,命名为feign(随意),新建接口如下:
//配置OpenFeignClient只需要使用@FeignClient来注解一个interface即可
//value的值就是上面步骤中在yml配置的name,也就是在eureka上注册的名字
@FeignClient(value = "openfeign-server",fallbackFactory = 接口实现类的名字.class)
public interface OpenFeignService {
//这里接口的路径和参数要和被调用的Rest服务保持一致,全路径,不允许map类型的参数,不允许有歧义的参数,参数最好都是有注解的,如@RequestParam,@RequestBody,@PathVarable
@GetMapping("getUserName")
String getUserName(@RequestParam("userId") String userId);
@GetMapping("getUserAge")
String getUserAge(@RequestParam("userId") String userId, @RequestBody User user);
}
2.在相同软件包下,分包,新建实现类如下:
@Slf4j
@Component
public Class OpenFeignServiceFallbackFactory implements FallbackFactory {
@Override
public OpenFeignService create(Throwable throwable){
log.error(throwable.getMessage);
return new OpenFeignService(){
@Override
public String getUserName(String userId){return null;}
@Override
public String getUserAge(String userId, User user){return null;
};
}
}
3.在controller中调用方法和其他接口一致,具体如下:
@Slf4j
@RestController
public class UserController {
@Autowired
private OpenFeignService openFeignService;
@GetMapping("getUserName2")
public void getUserName(){
userClient.getUserName("100");
}
}
4.注意(参数相关):
一般使用@GetMapping和@PostMapping两种方式来调用Rest服务。接收的参数使用@RequestParam和@RequestBody来获取。@RequestBody只能用在Post请求,并且一个Post请求只能有一个@RequestBody。 @RequestBody的参数可以包括复杂类型。
@RequestParam可以用在Post和Get请求中,@RequestParam 的参数只能是基本类型或者Enum,或者List和Map(List和Map里面也只能是基本类型)。@RequestParam可以和@RequestBody一起使用。
如果是Get请求,又有复合类型, 比如我们想传递一个User对象。User对象里面只有普通的两个String属性。 这里我们可以使用@SpringQueryMap:
@GetMapping("getUserAge")
public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user);
@SpringQueryMap后面的参数只能是普通的POJO,不能是复合类型,否则解析不了。如果必须使用复合类型,那么使用@RequestBody吧。
1.日志配置
#日志配置
logging:
level:
com:
test: debug
2.代码中配置OpenFeign的日志级别
OpenFeign的Logger.Level有4种级别:
@Configuration
public class FeignLogConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
配置后就可以在日志里面看到DEBUG的所有HTTP请求信息。
openFeign实际上是已经引入了hystrix的相关jar包,所以可以直接使用,设置超时时间,超时后调用FallBack方法,实现熔断机制。
1.在要调用的微服务中添加依赖
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.在配置中开启熔断机制,添加超时时间
#默认是不支持的,所以这里要开启,设置为true
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
3.编写实现类(在第二步使用的时候我们已实现该类)
@Slf4j
@Component
public Class OpenFeignServiceFallbackFactory implements FallbackFactory {
@Override
public OpenFeignService create(Throwable throwable){
log.error(throwable.getMessage);
return new OpenFeignService(){
@Override
public String getUserName(String userId){return null;}
@Override
public String getUserAge(String userId, User user){return null;
};
}
}
4.在对应的Feign接口添加fallback属性(在第二部使用时我们已添加该属性)
@FeignClient(value = "openfeign-server",fallbackFactory = 接口实现类的名字.class)
public interface OpenFeignService {
@GetMapping("getUserName")
String getUserName(@RequestParam("userId") String userId);
@GetMapping("getUserAge")
String getUserAge(@RequestParam("userId") String userId, @RequestBody User user);
}
OpenFeign底层是使用Ribbon,Ribbon是负责做负载均衡的组件。所以是可以通过配置设置负载均衡的策略。默认的是轮询策略。如果要换成其他策略,改一下配置即可:
#服务名称
openfeign-server:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#有如下几种规则
#1.随机规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#2.轮询规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#3.重试规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
#4.响应时间权重规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
#5.最空闲连接策略规则
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
以上就是OpenFeign的实践过程,如有不足之处,欢迎各位批评指正!