Spring boot2X Consul如何通过RestTemplate实现服务调用
这篇文章主要介绍了springboot2XConsul如何通过RestTemplate实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Consul可以用于实现分布式系统的服务发现与配置
服务调用有两种方式:
A.使用RestTemplate进行服务调用
负载均衡——通过Ribbon注解RestTemplate
B.使用Feign进行声明式服务调用
负载均衡——默认使用Ribbon实现
先使用RestTemplate来实现
1.服务注册发现中心
启动Consul
consulagent-dev
2.服务端
在springboot2X整合Consul的基础上
添加服务provider,provider1
provider测试方法
packagecom.xyz.provider.controller; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; @RestController publicclassdemoController{ @RequestMapping("/hello") publicStringHello(){ return"hello,provider"; } }
provider1测试方法
packagecom.xyz.provider1.controller; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; @RestController publicclassdemoController{ @RequestMapping("/hello") publicStringHello(){ return"hello,anotherprovider"; } }
启动provider和provider1
浏览器访问http://localhost:8500
有两个服务提供者节点实例
3.客户端
(1)添加依赖
1.8 Greenwich.SR4 org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-consul-discovery org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
(2)添加配置
server.port=8015 spring.application.name=xyz-comsumer spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 spring.cloud.consul.discovery.register=false spring.cloud.consul.discovery.health-check-url=/actuator/health spring.cloud.consul.discovery.heartbeat.enabled=true management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always
(3)测试方法
获取所有注册的服务,从注册的服务中选取一个,服务调用
packagecom.xyz.comsumer.controller; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.cloud.client.ServiceInstance; importorg.springframework.cloud.client.discovery.DiscoveryClient; importorg.springframework.cloud.client.loadbalancer.LoadBalancerClient; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; importorg.springframework.web.client.RestTemplate; @RestController publicclassHelloController{ @Autowired privateLoadBalancerClientloadBalancer; @Autowired privateDiscoveryClientdiscoveryClient; privateStringserviceName="service-provider"; @RequestMapping("/services") publicObjectservices(){ returndiscoveryClient.getInstances(serviceName); } @RequestMapping("/discover") publicObjectdiscover(){ returnloadBalancer.choose(serviceName).getUri().toString(); } @RequestMapping("/hello") publicStringhello(){ ServiceInstanceserviceInstance=loadBalancer.choose(serviceName); StringcallServiceResult=newRestTemplate().getForObject(serviceInstance.getUri().toString()+"/hello",String.class); returncallServiceResult; } }
注:
客户端调用的服务名,是在服务端指定的,在服务端配置里使用spring.cloud.consul.discovery.service-name指注册到Consul的服务名称
测试
启动Consul
启动provider和provider1
启动comsumer
测试地址http://localhost:8015/services
返回结果
[ { "instanceId":"provider-8010", "serviceId":"service-provider", "host":"hkgi-PC", "port":8010, "secure":false, "metadata":{ "secure":"false" }, "uri":"http://hkgi-PC:8010", "scheme":null }, { "instanceId":"provider-8011", "serviceId":"service-provider", "host":"hkgi-PC", "port":8011, "secure":false, "metadata":{ "secure":"false" }, "uri":"http://hkgi-PC:8011", "scheme":null } ]
测试地址http://localhost:8015/discover
返回结果
- http://hkgi-PC:8011或http://hkgi-PC:8011
- 测试地址http://localhost:8015/hello
- 返回结果
- hello,provider或hello,anotherprovider
注:
结果交替出现的,这是因为负载均衡器是采用的是轮询的方式
说明:
调用的过程:
A.通过LoadBalancerClient查询服务
B.通过RestTemplate调用远程服务
Ribbon负载均衡策略
- BestAvailableRule
- AvailabilityFilteringRule
- WeightedResponseTimeRule
- RetryRule
- RoundRobinRule
- RandomRule
- ZoneAvoidanceRule
自定义Ribbon负载均衡——使用随机访问策略
修改启动类
packagecom.xyz.comsumer; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.cloud.client.loadbalancer.LoadBalanced; importorg.springframework.context.annotation.Bean; importorg.springframework.web.client.RestTemplate; @SpringBootApplication publicclassComsumerApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(ComsumerApplication.class,args); } @Bean @LoadBalanced publicRestTemplaterestTemplate(){ returnnewRestTemplate(); } }
服务调用
packagecom.xyz.comsumer.controller; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; importorg.springframework.web.client.RestTemplate; @RestController publicclassRibbonHelloController{ @Autowired privateRestTemplaterestTemplate; privateStringserviceName="service-provider"; @RequestMapping("/ribbon/hello") publicStringhello(){ StringcallServiceResult=restTemplate.getForObject("http://"+serviceName+"/hello",String.class); returncallServiceResult; } }
配置添加
service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
重新启动comsumer
测试地址http://localhost:8015/ribbon/hello
输出的结果不再是交替出现,改为随机的了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。