前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:深入、全面、系统的介绍springcloud与springcloud Alibaba微服务常用技术栈
🌰 文章简介:本文将介绍Ribbon负载均衡的原理,深入源码进行分析,并且手撕轮询算法,建议收藏备用,创作不易,敬请三连哦
🥒文章推荐:
微服务架构与springcloud 01——微服务入门
微服务架构与springcloud02——父工程构建及支付模块实现
微服务架构与springcloud03——项目热部署与消费者订单模块
微服务架构与springcloud04——Eureka服务注册与发现
springcloud05——Zookeeper实现支付微服务
【云原生】springcloud06——订单服务注册zookeeper
【云原生】springcloud07—Consul的服务注册与发现
【云原生】springcloud08——Ribbon负载均衡调用
【云原生】springcloud09——但愿发长久,空手撕Ribbon
文章目录
前面我们已经讲了服务注册的Eureka,Zookeeper,Consult,以及调用部分的的Ribbon和LoadBalancer,现在我们将学习服务调用的第二部分组件,Feign和OpenFeign,由于Feign已经停更了,我们直接进入OpenFeign的学习。
1.OpenFeign的简介
1.1 Feign与OpenFeign简介
官网文档:OpenFeign官网文档
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
1.2 Feign能干什么
简单来说,Feign定义服务调用的接口,通过注解即可绑定服务提供方的接口,让不同微服务方便的共用一套服务调用的模板。后面我们将通过code来深入理解。
2 OpenFeign的使用
2.1 服务架构
2.2 OpenFeign的使用步骤
2.3 建模块
新建模块cloud-consumer-feign-order80
2.4 写Pom
<dependencies>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.wangzhou.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
在idea右上角可以看到80服务的maven依赖,发现果然eureka,ribbon,hystrix等依赖都被一并导入进来了。
2.5 application.yml
server:
port: 80
eureka:
client:
register-with-eureka: true
service-url:
#defaultZone: http://eureka7001.com:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
2.6 主启动
@SpringBootApplication
@EnableFeignClients //激活并开启OpenFeign
public class OrderMainFeign80 {
public static void main(String[] args) {
new SpringApplication(OrderMainFeign80.class).run(args);
}
}
2.7 业务类
(1)service
在springcloud包下新建service.PaymentFeignService接口
(业务逻辑接口+@FeignClient配置调用provider服务。)
新建PaymentFeignService接口并新增注解@FeignClient
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") // 告知Feign要去Eureka上找名字为cloud-payment-service的微服务
public interface PaymentFeignService {
// 下面的接口与8001服务端保持一致,我们可以直接去copy
@GetMapping(value = "/payment/get/{id}")// value值为调用地址
public CommonResult getPaymentById(@PathVariable("id")Long id);
}
发现没有,现在service只需要写接口+使用注解即可,很清爽。
(2)Controller
controller暴露下接口,调用下service就大功告成。
@Slf4j
@RestController
public class PaymentFeignController {
//@Resource和@Autowired注解都是用来实现依赖注入的。
// 只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id")Long id){
log.info("********查询的id:" + id);
return paymentFeignService.getPaymentById(id);
}
}
2.8 测试
依次启动7001,7002Eureka集群,8001,8002服务提供者支付微服务集群,最后启动服务调用者订单模块OrderMainFeign80.
访问:http://localhost/consumer/payment/get/1
完活。
2.9 总结
再回过头来领悟下OpenFeign是怎么实现服务调用的:接口+注解。简单不?
3 OpenFeign的超时机制
在8001,8002的cotroller中增加如下接口。
@GetMapping("feign/timeout")
public String paymentTimeout() throws InterruptedException {
TimeUnit.SECONDS.sleep(3);
return serverPort;
}
改造下80的service,增加paymentTimeout(cv完事了)。
改造下controller
启动各个微服务后,再访问http://localhost:8001/payment/feign/timeout自测下。
再访问:http://localhost/consumer/payment/feign/timeout,宝子注意看: Read timed out executing GET http://CLOUD-PAYMENT-SERVICE/payment/feign/timeout!!!
我们可以通过配置来改变其超时等待时间。在80的yml中添加。
#没提示不管它,可以设置
ribbon:
#指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 5000
#指的是建立连接使用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ConnectTimeout: 5000
再测试即可。
4 OpenFeign的日志增强
OpenFeign可用进行日志增强,查看
其日志级别如下。
步骤
配置日志bean
在80的springcloud包下新建config.FeignConfig
import feign.Logger; //不要导错包
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
//打印最详细的日志
return Logger.Level.FULL;
}
}
在80的yml文件中添加:
#开启日志的feign客户端
logging:
level:
#feign日志以什么级别监控哪个接口
com.achang.springcloud.service.PaymentFeignService: debug #写你们自己的包名