📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 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项目

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon

       2、开发伪下单接口

       3、使用ribbon. (类似httpClient,URLConnection) 包装了更多东西

                     启动类增加注解

@Bean
                       @LoadBalanced
                       public RestTemplate restTemplate() {
                            return new RestTemplate();
                       }

       4、根据名称进行调用商品,获取商品详情

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_02

从eureka中的列表中得到product-service(是在yml中注册的名称)

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_feign_03

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon_04

 

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon_05


Ribbon的源码分析

分析@LoadBalanced

              1)首先从注册中心获取provider的列表

              2)通过一定的策略选择其中一个节点

              3)再返回给restTemplate调用

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon_06

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_07

 想要找的服务名称

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_08

   拿到了product-service的列表

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_springcloud_09

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_feign_10

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon_11

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_12

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_springcloud_13

(默认的策略)

serviceId(product-service)


自定义负载均衡策略:

http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties

在配置文件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")

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_14

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_微服务_15

官文

@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") 要和

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_springcloud_16

保持一致

              2、Http方法必须对应 

              3、使用requestBody,应该使用@PostMapping

               

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_微服务_17

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon_18

"id") int id)方式调用

"id"要和

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_19

(int id)保持一致


Feign核心源码解读和 服务间的调用方式ribbon、feign选择


       1、ribbon和feign两个的区别和选择

              选择feign

                     默认集成了ribbon

                     写起来更加思路清晰和方便

                     采用注解方式进行配置,配置熔断等方式方便 

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_ribbon_20

       2、超时配置

              默认options readtimeout是60,但是由于hystrix默认是1秒超时

springcloud 微服务模块之间maven引入 springcloud各微服务间调用_spring_21

              #修改调用超时时间  

feign:
                       client:
                         config:
                           default:
                             connectTimeout: 2000
                             readTimeout: 2000

                     模拟接口响应慢,线程睡眠新的方式

try {
                          TimeUnit.SECONDS.sleep(1);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。