}
}
2)修改OrderController
实现基于Ribbon的形式调用远程的微服务
1、使用@LoadBalanced声明RestTemplate
2、使用服务名称替换IP地址
package cn.itbluebox.order.controller;
import cn.itbluebox.order.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
@RequestMapping(“/order”)
public class OrderController {
//注入RestTemplate对象
@Autowired
private RestTemplate restTemplate;
/*
注入DiscoveryClient:
SpringCloud 提供的获取原数组的工具类
调用方法获取服务的元数据信息
*/
@Autowired
private DiscoveryClient discoveryClient;
/*
参数:商品ID
通过订单系统,调用商品服务
1、需要配置商品对象
2、需要调用商品服务
3、entity.Product
使用java 当中的urlconnection,httpclient,okhttp
*/
/*
实现基于Ribbon的形式调用远程的微服务
1、使用@LoadBalanced声明RestTemplate
2、使用服务名称替换IP地址
*/
@RequestMapping(value = “/buy/{id}”, method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
//如何调用商品服务?
return restTemplate.getForObject(“http://service-product/product/”+id,Product.class);
}
@RequestMapping(method = RequestMethod.POST)
public String save(@RequestBody Product product) {
restTemplate.postForObject(“http://service-product/product/”,product,Product.class);
return “保存成功”;
}
@RequestMapping(method = RequestMethod.PUT)
public String update(@RequestBody Product product) {
restTemplate.put(“http://service-product/product/”,product);
return “更新成功”;
}
@RequestMapping(value = “/{id}”, method = RequestMethod.DELETE)
public String delete(@PathVariable Long id) {
restTemplate.delete(“http://service-product/product/”+id);
return “删除成功”;
}
}
(3)运行测试
访问:http://localhost:9002/order/buy/1
=========================================================================
(1)什么是负载均衡
在搭建网站时,如果单节点的 web服务性能和可靠性都无法达到要求;
或者是在使用外网服务时,经常担心被人攻破,一不小心就会有打开外网端口的情况,通常这个时候加入负载均衡就能有效解决服务问题。
负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。
负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网个例、健康检查等功能,能够有效提供系统的安全性和可用性。
(2)客户端负载均衡与服务端负载均衡
服务端负载均衡
先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;
即在服务器端再进行负载均衡算法分配
客户端负载均衡
客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;
即在客户端就进行负载均衡算法分配
(1)搭建多服务实例
Ribbon是一个典型的客户端负载均衡器,Ribbon会获取服务的所有地址,
根据内部的负载均衡算法,获取本次请求的有效地址
1)准备两个商品微服务(9001,9011 )
修改product_service当中的ProductController类,设置spring cloud 自动的获取当前应用的ip地址
package cn.itbluebox.product.controller;
import cn.itbluebox.product.entity.Product;
import cn.itbluebox.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(“/product”)
public class ProductController {
@Autowired
private ProductService productService;
@Value(“${server.port}”)
private String port;
@Value(“${spring.cloud.client.ip-address}”) //spring cloud 自动的获取当前应用的ip地址
private String ip;
@RequestMapping(value = “/{id}”, method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
Product product = productService.findByID(id);
product.setProductName(“访问的服务地址:”+ip+“:”+port);
return product;
}
@RequestMapping(method = RequestMethod.POST)
public String save(@RequestBody Product product) {
productService.save(product);
return “保存成功”;
}
@RequestMapping(method = RequestMethod.PUT)
public String update(@RequestBody Product product) {
productService.update(product);
return “更新成功”;
}
@RequestMapping(value = “/{id}”, method = RequestMethod.DELETE)
public String delete(@PathVariable Long id) {
productService.delete(id);
return “删除成功”;
}
}
2)运行测试
访问:http://localhost:9001/product/1
3)设置复制另外一个启动方式
- 修改端口号
- 复制项目启动
- 访问Eureka。查看信息http://localhost:9000/
- 为了方便后期测试,将product_service当中的application.yml改回原来的配置
(2)在订单系统中远程以负载均衡的形式调用商品服务(order_service)
在之前在 @LoadBalanced
已当中经配置了,直接启动就实现负载均衡
访问http://localhost:9002/order/buy/1
我们发现端口是9011
刷新页面
我们发现端口是9001
再次刷新页面
我们发现端口是9011
上述情况我们实现了负载均衡
(3)修改order_service设置application.yml修改Ribbon的策略配置
-
com.netflix.loadbalancer.RoundRobinRule :以轮询的方式进行负载均衡。
-
com.netflix.loadbalancer.RandomRule :随机策略
-
com.netflix.loadbalancer.RetryRule :重试策略。
-
com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大。
-
com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
-
com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略。过滤掉故障和请
求数超过阈值的服务实例,再从剩下的实力中轮询调用。
修改ribbon的负载均衡策略 服务名称 + ribbon - NFLoadBalancerRuleClassName : 策略
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
程序启动order_service
访问:
http://localhost:9002/order/buy/1
刷新
刷新
1、如果每个机器配置一样,则建议不修改策略 (推荐)
2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule
完善后面的测试设置上述的配置注释掉
(4)Ribbon:请求重试
1)完善后面的测试在order_service当中的application.yml设置上述的配置注释掉
设置打印日志
logging:
level:
root: debug #使用ip地址注册
重新运行测试
访问:http://localhost:9002/order/buy/1
刷新
在这里我们关闭一台ProductApplication模拟网络波动
刷新页面
再次刷新
2)Ribbon重试机制
引入Spring的重试组件
对Ribbon进行重试的配置
01)引入Spring的重试组件,修改order_service的pom.xml
org.springframework.retry
spring-retry
02)设置重试机制
service-product:
ribbon:
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
访问测试:http://localhost:9002/order/buy/1
刷新
启动停掉的服务
刷新页面
刷新
现在我们关闭一个服务
刷新页面
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
6JOd55uS5a2QaXRibHVlYm94,size_14,color_FFFFFF,t_70,g_se,x_16)
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-CVJM5heC-1715721546101)]
[外链图片转存中…(img-ze5RZMWQ-1715721546102)]
[外链图片转存中…(img-XU46lnTG-1715721546102)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!