SpringCloud生產消費者

SpringCloud生產消費者

生產者與消費者

上一篇文章介紹了Euarka的搭建,SpringCloud服務註冊中心
本篇文章,咱們搭建倆個服務,生產者服務與消費者服務。java

本文就以電商系統爲例:服務生產者,訂單查詢服務order-server,服務消費者order-clientweb

說明: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請求包含倆種方法getForObjectgetForEntity,他們有什麼區別呢?

  • 從接口的簽名上,能夠看出一個是直接返回預期的對象,一個則是將對象包裝到 ResponseEntity 封裝類中
  • 若是隻關心返回結果,那麼直接用 getForObject 便可
  • 若是除了返回的實體內容以外,還須要獲取返回的header等信息,則可使用 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的服務註冊發現機制,實現的服務之間的相互調用。
固然,這裏邊還有不少的細節須要討論,後續的文章,繼續和你們討論。

相關文章
相關標籤/搜索