📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
目录
常用的微服务间的调用方式
RPC:
Rest(Http):
ribbon订单调用商品服务
自定义负载均衡策略:
feign方式实现服务间的调用
Feign核心源码解读和 服务间的调用方式ribbon、feign选择
看完之后,结尾有彩蛋欧
常用的微服务间的调用方式
RPC:
远程过程调用,像调用本地服务(方法)一样调用服务器的服务
支持同步、异步调用
可以一次建立一个,也可以多个调用复用一次链接(建立连接耗时)大公司多用RPC
PRC数据包小
protobuf
thrift
rpc:编解码,序列化,链接,丢包,协议(成本大)
Rest(Http):
http请求,支持多种协议和功能
开发方便成本低
http数据包大
java开发:HttpClient,URLConnection
spring cloud暂时用这种方式
ribbon订单调用商品服务
1、创建order_service项目
2、开发伪下单接口
3、使用ribbon. (类似httpClient,URLConnection) 包装了更多东西
启动类增加注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
4、根据名称进行调用商品,获取商品详情
从eureka中的列表中得到product-service(是在yml中注册的名称)
Ribbon的源码分析
分析@LoadBalanced
1)首先从注册中心获取provider的列表
2)通过一定的策略选择其中一个节点
3)再返回给restTemplate调用
想要找的服务名称
拿到了product-service的列表
(默认的策略)
serviceId(product-service)
自定义负载均衡策略:
在配置文件yml里面,自定义负载均衡策略
#自定义负载均衡策略
product-service: (要找的服务名注册中心的名称 调用哪个服务的策略,可以有很多服务每个服务有对应的策略)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略选择:
1、如果每个机器配置一样,则建议不修改策略 (推荐)
2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule (看IRule的实现类)
feign方式实现服务间的调用
改造电商项目 订单服务 调用商品服务获取商品信息
Feign: 伪RPC客户端(本质还是用http)
官方文档: Page Redirection
(新旧版本依赖名称不一样)
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类增加@EnableFeignClients
增加一个接口 并@FeignClient(name="product-service")
官文
@SpringBootApplication
@EnableFeignClients
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
@FeignClient("name")
static interface NameService {
@RequestMapping("/")
public String getName();
}
}
2、编码实战
@FeignClient(name="product-service")
public interface ProductClients {
@GetMapping("/api/v1/product/find")
String findById(@RequestParam(value = "id")int id);
}
@Resource
ProductClients productClients;
@Override
public ProductOrder save(int userId, int productId) {
//Object object = restTemplate.getForObject("http://product-service/api/v1/product/find?id=" + productId, Object.class);
// System.out.println(object);
// Map<String,Object> productMap = restTemplate.getForObject("http://product-service/api/v1/product/find?id=" + productId, Map.class);
String response = productClients.findById(productId);
JsonNode jsonNode = JsonUtil.str2JsonNode(response);
ProductOrder productOrder = new ProductOrder();
productOrder.setCreateTime(new Date());
productOrder.setTradeNo(UUID.randomUUID().toString());
productOrder.setUserId(userId);productOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString()) );
productOrder.setProductName(jsonNode.get("name").toString());
return productOrder;
}
3、注意点:
1、路径 (要和调用方product-service的路由保持一致)
@FeignClient(name="product-service") 要和
保持一致
2、Http方法必须对应
3、使用requestBody,应该使用@PostMapping
"id") int id)方式调用
"id"要和
(int id)保持一致
Feign核心源码解读和 服务间的调用方式ribbon、feign选择
1、ribbon和feign两个的区别和选择
选择feign
默认集成了ribbon
写起来更加思路清晰和方便
采用注解方式进行配置,配置熔断等方式方便
2、超时配置
默认options readtimeout是60,但是由于hystrix默认是1秒超时
#修改调用超时时间
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
模拟接口响应慢,线程睡眠新的方式
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。