美声广告网站建设,做网站开发要安装哪些软件,怎么在免费空间里面做网站,上海画册设计概述
本文介绍微服务的服务调用和负载均衡#xff0c;使用spring cloud的loadbalancer及openfeign两种技术来实现。
本文的操作是在微服务的初步使用的基础上进行。 环境说明
jdk1.8
maven3.6.3
mysql8
spring cloud2021.0.8
spring boot2.7.12
idea2022 步骤
改造Eu…概述
本文介绍微服务的服务调用和负载均衡使用spring cloud的loadbalancer及openfeign两种技术来实现。
本文的操作是在微服务的初步使用的基础上进行。 环境说明
jdk1.8
maven3.6.3
mysql8
spring cloud2021.0.8
spring boot2.7.12
idea2022 步骤
改造Eureka为单节点
为了方便测试把高可用Eureka还原为单节点Eureka。 修改eureka_server的application.yml
spring:application:name: eureka-server
server:port: 9000
eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/server:enable-self-preservation: falseeviction-interval-timer-in-ms: 4000
修改product-service服务和order-service服务的application.yml的Eureka配置如下
eureka:client:service-url:defaultZone: http://localhost:9000/eureka/ spring-cloud-loadbalancer
spring-cloud-loadbalancer和ribbon类似之前的spring cloud版本eureka内部继承了ribbon 但spring cloud版本升级后不再内置ribbon可查看依赖关系spring cloud提供了自己的负载均衡的实现可查看 官方文档 Spring Cloud provides its own client-side load-balancer abstraction and implementation. For the load-balancing mechanism, ReactiveLoadBalancer interface has been added and a Round-Robin-based and Random implementations have been provided for it. In order to get instances to select from reactive ServiceInstanceListSupplier is used. Currently we support a service-discovery-based implementation of ServiceInstanceListSupplier that retrieves available instances from Service Discovery using a Discovery Client available in the classpath. 服务调用
之前服务调用时使用host:ip拼接成URL的方式进行调用较为麻烦使用LoadBalanced注解后可以使用微服务的服务名称来进行调用更加方便。 在创建RestTemplate的时候申明LoadBalanced
使用restTemplate调用远程微服务不需要拼接微服务的URL用服务名称替换IP地址
修改OrderController.java使用服务名称代替host:port的形式避免了之前的使用实例元数据进行拼接。
修改前
product restTemplate.getForObject(http://host:port/product/1, Product.class);
修改后
product restTemplate.getForObject(http://service-product/product/1, Product.class);
启动测试
启动eureka、product、order服务
浏览器访问 能访问到数据说明服务调用成功了。 负载均衡
使用LoadBalanced注解后除了方便使用服务名称进行调用之外更重要的是也实现了服务调用的负载均衡功能。准备两个商品服务端口号分别为9001、9011两个商品服务的作用1.增加系统吞吐率 2.商品服务高可用。
服务架构及流程如下图 修改product-service的controller Value(${spring.cloud.client.ip-address}) //springcloud自动获取应用的ip地址private String ip; 启动product服务9001端口 修改product服务的yml修改服务端口为9011 复制运行配置得到另一个proudct服务 启动product2服务9011端口 查看Eureka Web页面 http://localhost:9000/ 看到SERVICE-PRODUCT有2个在线状态的实例端口分别是9001和9011 启动order服务
分别访问9001和9011 http://localhost:9001/product/1 http://localhost:9011/product/1 两个商品服务均正常 测试负载均衡
访问如下链接2次 http://localhost:9002/order/buy/1 发现实现 第一次访问9001商品服务第二次访问了9011商品服务说明实现了客户端的负载均衡 多次刷新访问http://localhost:9002/order/buy/1发现9001和9011是交替出现说明默认使用的负载均衡是轮询策略。 OpenFeign
此前的服务调用代码如下
restTemplate.getForObject(http://service-product/product/1, Product.class);
如果请求参数过多是拼接URL的方式显得麻烦可以使用OpenFeign来解决。
OpenFeign 全称 Spring Cloud OpenFeign它是 Spring 官方推出的一种声明式服务调用与负载均衡组件它的出现就是为了替代进入停更维护状态的 Feign。
OpenFeign 是 Spring Cloud 对 Feign 的二次封装它具有 Feign 的所有功能并在 Feign 的基础上增加了对 Spring MVC 注解的支持。 OpenFeign的使用
在order-service操作
1.导入依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency
2.配置调用接口
业务需求order服务调用product服务 FeignClient(name service-product)
public interface ProductFeignClient {/*** 配置需要调用的微服务接口* return*/RequestMapping(value /product/{id}, method RequestMethod.GET)Product findById(PathVariable(id) Long id);
} 3.在启动类上激活feign
//激活feign
EnableFeignClients
public class OrderApplication {
4.通过自动注入的接口调用远程微服务
修改之前的Controller代码
RestController
RequestMapping(/order)
public class OrderController {Autowiredprivate RestTemplate restTemplate;Autowiredprivate DiscoveryClient discoveryClient;RequestMapping(value /buy/{id}, method RequestMethod.GET)public Product findById(PathVariable Long id){Product product null;product restTemplate.getForObject(http://service-product/product/1, Product.class);return product;}}
修改之后的代码
RestController
RequestMapping(/order)
public class OrderController {Autowiredprivate ProductFeignClient productFeignClient;RequestMapping(value /buy/{id}, method RequestMethod.GET)public Product findById(PathVariable Long id){Product product null;//调用微服务product productFeignClient.findById(id);return product;}}
可以看出OrderController通过注入ProductFeignClient接口实例并调用接口方法实现了调用。 可以看出不需要自己构建http请求就像是调用自身工程的方法调用。如果有多个参数可以传递对象参数避免了拼接url的麻烦。 测试
启动服务
启动eureka、启动product启动两个实例9000和9011、启动order
浏览器访问
分别访问确保product服务能正常访问 http://localhost:9001/product/1 http://localhost:9011/product/1 访问order两次 http://localhost:9002/order/buy/1 多次访问发现9001和9011交替出现说明实现了负载均衡。 OpenFeign的配置
如果需要配置OpenFeign在application.yml添加相关配置
配置案例如下
feign:client:config:feignName: #FeginClient的名称connectTimeout: 5000 #建立链接的超时时长readTimeout: 5000 #读取超时时长loggerLevel: full #Fegin的日志级别errorDecoder: com.example.SimpleErrorDecoder #Feign的错误解码器retryer: com.example.SimpleRetryer #配置重试requestInterceptors: #添加请求拦截器- com.example.FooRequestInterceptor- com.example.BarRequestInterceptordecode404: false #配置熔断不处理404异常#日志配置 #NONE : 不输出日志(高) #BASIC: 适用于生产环境追踪问题#HEADERS : 在BASIC的基础上,记录请求和响应头信息 #FULL : 记录所有service-product:logger-level: FULL #配置商品服务日志compression:request:enabled: true #开启请求压缩mime-types: text/html,application/xml,application/json #设置压缩的数据类型min-request-size: 2048 #设置触发压缩的大小下限response:enabled: true #开启相应压缩
logging:level:org.example.order.feign.ProductFeignClient: debug #配置具体接口的日志级别 总结
两种服务调用及负载均衡技术LoadBalanced方式和OpenFeign的方式。
1.LoadBalanced方式是借助于RestTemplate方式进行可以直接使用服务名称来调用但需要拼接URL。
2.OpenFeign的方式是通过声明接口并注入接口进行调用避免了拼接URL的麻烦。 完成enjoy it!