博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud 微服务 (六) 服务通信 RestTemplate
阅读量:7025 次
发布时间:2019-06-28

本文共 3962 字,大约阅读时间需要 13 分钟。

hot3.png

通信的方式主要有两种,Http 和 RPC

SpringCloud使用的是Http方式通信, Dubbo的通信方式是RPC

记录学习SpringCloud的restful方式: RestTemplate (本篇)、Feign

 

RestTemplate 类似 HttpClient,使用更简洁一些,下面一步一步学习

在之前学习中;在E:/MyCloud的中已经存在名为eureka的注册中心,和一个名为client的服务

不用管,为了区分开学习,重新建两个服务,一个product,一个order,这里不说怎么建了,IDEA一键生成即可(注册中心一直是开启状态)

product 服务端口不设置,在启动项中设置,方便可以开启不同端口的多服务,在第(四)篇有记录,启动一个8081 和 一个8082,便于测试

yml中配置 : (spring.application.name=product 标识name后面会用到)

spring:  application:    name: producteureka:  client:    service-url:     defaultZone: http://localhost:8761/eureka/

加一个简单的接口,product 服务这块就完成了,两个应用都启动(8081,8082)

@RestControllerpublic class ProductsController {    @GetMapping("/products")    public String products(){        return "hello,this is products";    }}

在注册中心,可以发现服务,PRODUCT

6c56114a1a2e1a456d08dab72804e273e30.jpg

 

order 服务 端口设置8083,spring.application.name=order,其他基础yml配置与product一致

访问product服务中的接口的几种方式,如下: Controller 代码

import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import static java.lang.String.format;@RestController@Slf4jpublic class OrderController {    //第二种方式 使用    @Autowired    private LoadBalancerClient client;    //第三种方式 使用    @Autowired    private RestTemplate restTemplate;    @GetMapping("/get")    public String getProducts(){        RestTemplate restTemplate=new RestTemplate();        //第一种方式 直接请求 getForObject(请求url,返回类型)        String first_type=restTemplate.getForObject("http://localhost:8081/products",String.class);        log.info("first response={}",first_type);        //如果确定就那个一个,用最简单的就好了        //如果product项目启动不同端口服务,用负载均衡方式,那么第一种方式就比较死气,刚好指向的那个挂了,就不好了        //第二种方式 通过注册中心,1.获取host+port,2.获取uri 并发出请求        //choose的参数为注册中心Instances currently registered with Eureka下面Application的名字        //服务会自己选择一个服务接口发送请求,负载均衡的方式选择有很多,比如随机,顺序等等        ServiceInstance instance=client.choose("PRODUCT");        String url= format("http://%s:%s",instance.getHost(),instance.getPort())+"/products";        String second_type_1=restTemplate.getForObject(url,String.class);        System.out.println(second_type_1);        String second_type_2=restTemplate.getForObject(instance.getUri()+"/products",String.class);        System.out.println(second_type_2);        //第三种方式,类似第二种方式,需要将restTemplate以注解@bean方式注入,并加上@LoadBalanced注解        //请求拼接http:// + Application的名字 + 接口名字        String third_type=restTemplate.getForObject("http://PRODUCT/products",String.class);        System.out.println(third_type);        return "";    }}

第三种使用到RestTemplateConfig的代码:

import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import org.springframework.web.client.RestTemplate;@Componentpublic class RestTemplateConfig {    @Bean    @LoadBalanced    public RestTemplate restTemplate(){        return new RestTemplate();    }}

 

Eureka属于客户端发现,他的负载均衡属于客户端向服务器获取已经注册的可用服务信息,然后根据其负载均衡的策略(随机,顺序等),选其中一个,发送请求,这个过程是在客户端完成的,属于软负载,并不需要服务器的参与

SpringCloud中客户端负载均衡组件是Ribbon,有上面的RestTemplate,还有Feign、zuul等后面继续学习,都使用到Ribbon

Ribbon实现软负载有三点核心:

服务发现 : 找服务,就像上面测试的依据application的名字,找到是哪个服务

服务选择规则 : 从多个服务中,选择一个有效的服务

服务监听 : 检测失效的服务,将不会再去命中失效的服务

Ribbon的主要组件: ServerList、IRule、ServerListFilter等

Ribbon流程 : 通过ServerList获取所有可用服务列表,然后通过ServerListFilter过滤一部分服务, 最后使用IRule选择一个目标

查看Ribbon的源码,发现ServerList方法是过时的,使用另一个getAllServers方法

IRule默认的命中方式是自然顺序的方式,如果想改变方式可以,参考官网的文档如下:

191e3dbae76d5e261a90010443bb33f545f.jpg

那么我们在yml中加入如下配置: 随机方式(其他方式可以在实现IRule接口的方法中查找,路径须写全)

PRODUCT:  ribbon:    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

文档可以找中文的,也可以看官方英文的,看自己爱好,耐心很重要,url: spring.io

 

 

本篇不记录更多了,一段一段消化,下篇再继续Feign的学习

------------------------------------------------------------

转载于:https://my.oschina.net/u/3829444/blog/1831933

你可能感兴趣的文章
数据库性能测试---前阿里数据库团队资深DBA杨奇龙
查看>>
C++之函数fgetc和fputc、fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
查看>>
李洪强iOS开发之宏定义方法来初始化一个单例对象
查看>>
Qt中将QString转换为char *或者相反
查看>>
【python-mysql】在ubuntu下安装python-mysql环境
查看>>
Android NDK的生命周期JNI_OnLoad与JNI_OnUnload(转)
查看>>
子网掩码的两种表示方法
查看>>
C# Chart 折线图 多条数据展示
查看>>
第三十一节,time时间模块
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
Linux进程间通信(五):信号量 semget()、semop()、semctl()
查看>>
spring jpa 实体互相引用返回restful数据循环引用报错的问题
查看>>
前端组件化Polymer入门教程(1)——初识&&安装
查看>>
vim 标签页 tabnew 等的操作命令
查看>>
VR虚拟现实的工作原理,你知道多少?【转】
查看>>
NGUI在5.3打包失败问题
查看>>
反向代理/负载均衡/session/cookie
查看>>
深入理解css中vertical-align属性
查看>>
iText导出pdf、word、图片
查看>>
Apache CXF实战之二 集成Sping与Web容器
查看>>