1、SpringCloud全家桶—注册中心Eureka搭建
2、SpringCloud全家桶—注册中心Eureka高可用环境搭建
3、SpringCloud全家桶—客户端负载均衡Ribbon
4、SpringCloud全家桶—OpenFeign
5、SpringCloud全家桶—断路器Hystrix
6、SpringCloud全家桶—HystrixDashboard配置与基础功能演示
7、SpringCloud全家桶—Zuul网关
OpenFeign
OpenFeign是一种声明式、模板化的HTTP请求,相比前面我们使用RestTemplate的方式,OpenFeign能够更加的便捷、优雅的完成微服务之间的HTTP调用。
OpenFeign的使用也非常简单,通过注解的方式即可完成,使调用者感觉就像是在调用服务内部的接口一样,同时Openfeign还集成了Hystrix和Ribbon,使得调用可以自然的实现负载均衡和Hystrix相关的功能。
基本使用
接着上一遍Ribbon环境,搭建OpenFeign也非常简单。
1、引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、启动类添加@EnableFeignClients注解
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
public class MembershipApplication {
public static void main(String[] args) {
SpringApplication.run(MembershipApplication.class, args);
}
}
3、定义FeignClient接口,name是要调用的服务名。
@FeignClient(name = "order")
public interface OrderFeign {
@RequestMapping(value = "/userOrder/getOrderInfo", method = RequestMethod.GET)
String getOrderInfo();
}
4、调用
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private OrderFeign orderFeign;
@PostMapping("/queryOrder")
public String queryOrder() {
String str = orderFeign.getOrderInfo();
return str;
}
}
4步即完成了一个服务之间的请求,服务提供方无需任何修改。
Feign 日志
为每个Feign客户端创建一个logger。默认情况下,logger的名称是用于创建Feign客户端的接口的全类名称。Feign日志记录仅响应DEBUG级别。
可以通过修改Logger.Level来控制日志记录的内容:
/**
* Controls the level of logging.
*/
public enum Level {
/**
* No logging.
*/
NONE,
/**
* Log only the request method and URL and the response status code and execution time.
*/
BASIC,
/**
* Log the basic information along with request and response headers.
*/
HEADERS,
/**
* Log the headers, body, and metadata for both requests and responses.
*/
FULL
}
NONE:无日志记录(DEFAULT)。
BASIC:仅记录请求方法和URL以及响应状态代码和执行时间。
HEADERS:记录基本信息以及请求和响应头。
FULL:记录请求和响应的标题,正文和元数据。
1、配置文件的方式
feign.client.config.order.logger-level=full
logging.level.com.wyl.springcloud.feign.OrderFeign=debug
2、编码的方式
新增:configuration = FeignConfig.class
@FeignClient(name = "order",configuration = FeignConfig.class)
public interface OrderFeign {
@RequestMapping(value = "/userOrder/getOrderInfo", method = RequestMethod.GET)
String getOrderInfo();
}
FeignConfig
import feign.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FeignLoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLevel() {
return Logger.Level.FULL;
}
@Bean
FeignLoggerFactory orderFeignLoggerFactory() {
return new OrderFeignLoggerFactory();
}
public static class OrderFeignLoggerFactory implements FeignLoggerFactory {
@Override
public Logger create(Class<?> type) {
return new OrderFeignLogger(LoggerFactory.getLogger(type));
}
}
}
import org.slf4j.Logger;
public class OrderFeignLogger extends feign.Logger {
private final Logger logger;
public OrderFeignLogger(Logger logger) {
this.logger = logger;
}
@Override
protected void log(String configKey, String format, Object... args) {
if (logger.isInfoEnabled()) {
logger.info(String.format(methodTag(configKey) + format, args));
}
}
}