上一篇文章介紹了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
的服務註冊發現機制,實現的服務之間的相互調用。
固然,這裏邊還有不少的細節須要討論,後續的文章,繼續和你們討論。