服务测试环境
1.引入Eureka所需的依赖
2.修改配置文件
3.启动服务
4.测试
消费者
1.发现客户端方式
2.Ribbon方式功能的Spring RestTemplate
3.feign客户端方式
本文主要介绍SpringCloud中调用服务的方式:
Spring DiscoveryClient
支持 Ribbon 的 RestTemplate
Feign客户端
服务测试环境
测试中,发现Netflix的Eureka服务层采用。
主要步骤如下:
1.引入Eureka所需的依赖
org.springframework.cloud spring-cloud-starter-eureka-server org.springframework.cloud spring-cloud-starter-eureka
2.修改配置文件
服务端:
eureka: instance: hostname:eureka9001.com#eureka服务端的实例名称 instance-id:eureka9001 client: register-with-eureka:false#false表示不向注册中心注册自己 fetch-registry:false##false表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务 service-url: defaulteZone:http://127.0.0.1:9001
客户端1:
server: port:8002 spring: application: name:licensingservice eureka: instance: instance-id:licensing-service-8002 prefer-ip-address:true client: register-with-eureka:true fetch-registry:true service-url: defaultZone:http://127.0.0.1:9001/eureka/,
客户端2:
server: port:8002 spring: application: name:licensingservice eureka: instance: instance-id:licensing-service-8002 prefer-ip-address:true client: register-with-eureka:true fetch-registry:true service-url: defaultZone:http://127.0.0.1:9001/eureka/,
一组微服务的不同实例采办服务名称不同,不同的实例ID不同,不同,spring.application.name和eureka.instance.instance-id。
3.启动服务
服务端:
@SpringBootApplication @EnableEurekaServer publicclassEurekaServerPort9001_App{ publicstaticvoidmain(String[]args){ SpringApplication.run(EurekaServerPort9001_App.class,args); } }
客户端:
@SpringBootApplication @RefreshScope @EnableEurekaClient publicclassLicenseApplication_8002{ publicstaticvoidmain(String[]args){ SpringApplication.run(LicenseApplication_8002.class,args); } }
4.测试
进入到Eureka服务端地址,我这是127.0.0.1:9001,可以查看注册到注册中心的服务。
标签:
注意:Eureka通过两次服务检测均到通过,服务将在间隔10秒内成功启动服务注册等待30秒。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
消费者
1.发现客户端方式
服务中既是服务是微信也可以是调用者,消费者配置和上面配置的大体参考一致,依赖及配置服务端启动方式EnableEurekaClient:监听启动。
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient publicclassConsumerApplication_7002{ publicstaticvoidmain(String[]args){ SpringApplication.run(ConsumerApplication_7002.class,args); } }
核心配置类:
@Component publicclassConsumerDiscoveryClient{ @Autowired privateDiscoveryClientdiscoveryClient; publicServiceInstancegetServiceInstance(){ ListserviceInstances=discoveryClient.getInstances("licensingservice"); if(serviceInstances.size()==0){ returnnull; } returnserviceInstances.get(0); } publicStringgetUrl(Stringurl){ ServiceInstanceserviceInstance=this.getServiceInstance(); if(serviceInstance==null) thrownewRuntimeException("404,NOTFOUND"); StringurlR=String.format(url,serviceInstance.getUri().toString()); returnurlR; } }
通过DiscoveryClient从尤里卡中获取licensingservice服务的实例,并返回第一个实例。
测试控制器
@RestController @RequestMapping("test") publicclassTestController{ //注意必须new,否则会被ribbon拦截器拦截,改变URL行为 privateRestTemplaterestTemplate=newRestTemplate(); @Autowired privateConsumerDiscoveryClientconsumerDiscoveryClient; @RequestMapping("/getAllEmp") publicListgetAllLicense(){ Stringurl=consumerDiscoveryClient.getUrl("%s/test/getAllEmp"); returnrestTemplate.getForObject(url,List.class); } }
测试:
调试信息
从该图可以看到licensingservice,拥有两个服务实例,并可以查看实例信息。
页面返回信息
成功查询到数据库存储信息。
2.Ribbon方式功能的Spring RestTemplate
同上。
核心配置类:
//指明负载均衡算法 @Bean publicIRuleiRule(){ returnnewRoundRobinRule(); } @Bean @LoadBalanced//告诉Spring创建一个支持Ribbon负载均衡的RestTemplate publicRestTemplaterestTemplate(){ returnnewRestTemplate(); }
设置均衡方式为轮询方式。
测试类:
@RestController @RequestMapping("rest") publicclassConsumerRestController{ @Autowired privateRestTemplaterestTemplate; privatefinalstaticStringSERVICE_URL_PREFIX="http://LICENSINGSERVICE"; @RequestMapping("/getById") publicEmpgetById(Longid){ MultiValueMapparamMap=newLinkedMultiValueMap (); paramMap.add("id",id); returnrestTemplate.postForObject(SERVICE_URL_PREFIX+"/test/getById",paramMap,Emp.class); } }
测试结果:
第一次:
第二次:
第三次:
因为采用轮询平均方式分别使用不同的服务实例,未区别,将名称确定了一定的。
这上面,Ribbon 是对第一种方式的封装方式和不同的负载率。 Feign的方式则大大降低了开发客户端和提升速度。
3.feign客户端方式
引入依赖:
org.springframework.cloud spring-cloud-starter-feign
主要代码:
@FeignClient(value="LICENSINGSERVICE",fallbackFactory=ServiceImp.class) publicinterfaceServiceInterface{ @RequestMapping("/test/getById") EmpgetById(@RequestParam("id")Longid); @RequestMapping("/test/getLicenseById") LicensegetLicenseById(@RequestParam("id")Longid); @RequestMapping("/test/getAllEmp") ListgetAllLicense(); } @Component publicclassServiceImpimplementsFallbackFactory { @Override publicServiceInterfacecreate(Throwablethrowable){ returnnewServiceInterface(){ @Override publicEmpgetById(Longid){ Empemp=newEmp(); emp.setName("iamfeignfallbackcreate"); returnemp; } @Override publicLicensegetLicenseById(Longid){ returnnull; } @Override publicList getAllLicense(){ returnnull; } }; } }
注采用接口模式,通过指定服务名以及方法,在服务开发结果不佳时,方便返回默认的,而不是一个不友好的错误。
主启动类:
@SpringBootApplication @EnableEurekaClient @EnableFeignClients publicclassConsumer_feign_Application_7004{ publicstaticvoidmain(String[]args){ SpringApplication.run(Consumer_feign_Application_7004.class,args); } }
测试类:
@RestController @RequestMapping("rest") publicclassConsumerRestController{ @Autowired privateServiceInterfaceserviceInterface; @Autowired privateRestTemplaterestTemplate; @RequestMapping("/getById") publicEmpgetById(Longid){ returnserviceInterface.getById(id); } }
测试结果:
正常测试:
关闭两个实例,模拟服务实例死亡:
假装能够故障服务调用,也可以实现调用的服务时,友好的信息。
以此方式,由低上,从不同层次实现了SpringCloud中的微服务相互引用。
审核编辑:刘清
-
模拟器件
+关注
关注
2文章
106浏览量
23209 -
服务端
+关注
关注
0文章
66浏览量
7004
原文标题:SpringCloud 三种服务调用方式,你学会了吗?
文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论