上一篇文章介绍了Euarka
的搭建,SpringCloud服务注册中心
本篇文章,咱们搭建俩个服务,生产者服务与消费者服务。java
本文就以电商系统为例:服务生产者,订单查询服务order-server
,服务消费者order-clien
tweb
说明:
order-server
服务提供查询订单信息的功能order-client
做为消费者服务,查询订单信息。spring
选择咱们须要的依赖,具体依赖以下浏览器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
spring-cloud-starter-netflix-eureka-client
表示该服务是一个eureka
的客户端
订单服务会注册到eureka
服务端上app
依赖添加完成后,咱们须要在SpringBoot
项目的入口类上加上
@EnableDiscoveryClient
注解框架
表示开启服务注册到eureka
服务上ide
@SpringBootApplication @EnableDiscoveryClient public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
接下来,须要咱们对订单服务进行必要的配置spring-boot
server: port: 8081 spring: application: name: order-service eureka: client: service-url: defaultZone: http://localhost:8761/eureka
说明:
server.prot
:订单服务的端口源码分析
spring.application.name
:订单服务的名称,post
这个名称会注册到
eureka
服务上
eureka.client.service-url.defaultZone
:eureka
服务的地址。
通过简单的配置之后,咱们启动服务,访问eureka服务,http://localhost:8761
,以下图:
咱们将订单服务以及注册到eureka
服务上了。此事,
咱们提供一个订单查询的接口,模拟订单查询功能。
@RestController @RequestMapping("query") public class OrderQueryController { @Autowired OrderQueryService queryService; @RequestMapping("info") public String queryOrder(){ return queryService.queryOrder(); } } @Service public class OrderQueryService { public String queryOrder(){ return "订单信息查询成功"; } }
只须要像搭建服务提供者同样搭建服务消费者就能够,
搭建完成之后,咱们使用RestTemplate
来调用订单服务进行订单信息查询,具体配置及代码以下:
server: port: 8082 spring: application: name: order-client eureka: client: service-url: defaultZone: http://localhost:8761/eureka
//提供一个RestTemplate实例 @SpringBootApplication @EnableDiscoveryClient public class OrderClientApplication { public static void main(String[] args) { SpringApplication.run(OrderClientApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } //编写测试接口 @RestController public class ClientController { @Autowired ClientService clientService; @RequestMapping(value = "/info",method = RequestMethod.GET) public String queryOrderInfo(){ return "restTemplate访问服务提供者返回的信息:"+clientService.queryOrderInfo(); } } //模拟具体查询业务逻辑 @Service public class ClientService { @Autowired RestTemplate restTemplate; public String queryOrderInfo(){ System.out.println("经过restTemplate访问服务提供者"); return restTemplate.getForEntity("http://ORDER-SERVER/query/info", String.class).getBody(); } }
RestTemplate
介绍:
是spring框架提供的可用于在应用中调用rest服务,它简化了与http服务的通讯方式,统一了RESTful的标准,封装了http连接, 咱们只须要传入url及返回值类型便可。相较于以前经常使用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
部分源码以下,能够看出,它包含了Get、Post、Put等请求,好比Get请求包含俩种方法
getForObject
、getForEntity
,他们有什么区别呢?
ResponseEntity
封装类中getForObject
便可getForEntity
@Override @Nullable public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables); } @Override @Nullable public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables); } @Override @Nullable public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor); } @Override public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables)); } @Override public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables)); } @Override public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor)); } // HEAD @Override public HttpHeaders headForHeaders(String url, Object... uriVariables) throws RestClientException { return nonNull(execute(url, HttpMethod.HEAD, null, headersExtractor(), uriVariables)); } @Override public HttpHeaders headForHeaders(String url, Map<String, ?> uriVariables) throws RestClientException { return nonNull(execute(url, HttpMethod.HEAD, null, headersExtractor(), uriVariables)); } @Override public HttpHeaders headForHeaders(URI url) throws RestClientException { return nonNull(execute(url, HttpMethod.HEAD, null, headersExtractor())); } // POST @Override @Nullable public URI postForLocation(String url, @Nullable Object request, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); HttpHeaders headers = execute(url, HttpMethod.POST, requestCallback, headersExtractor(), uriVariables); return (headers != null ? headers.getLocation() : null); } @Override @Nullable public URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); HttpHeaders headers = execute(url, HttpMethod.POST, requestCallback, headersExtractor(), uriVariables); return (headers != null ? headers.getLocation() : null); } @Override @Nullable public URI postForLocation(URI url, @Nullable Object request) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); HttpHeaders headers = execute(url, HttpMethod.POST, requestCallback, headersExtractor()); return (headers != null ? headers.getLocation() : null); } @Override @Nullable public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); } @Override @Nullable public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); } @Override @Nullable public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters()); return execute(url, HttpMethod.POST, requestCallback, responseExtractor); } @Override public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables)); } @Override public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables)); } @Override public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor)); }
接下来,咱们启动,服务消费者,
此时访问咱们的eureka
服务,
已经有俩个服务注册上来了,以下:
最后咱们来验证一下,服务消费者是否能调用到服务提供者,
在浏览器输出http://localhost:8082/info
根据返回的信息,确认服务调用成功。
以上就是咱们基于eureka
的服务注册发现机制,实现的服务之间的相互调用。
固然,这里边还有不少的细节须要讨论,后续的文章,继续和你们讨论。