SpringCloud之服務呼叫

xbmchina發表於2019-04-03

SpringCloud之服務呼叫

簡介

SpringCloud的服務呼叫有兩個東西: Ribbon是一個客戶端的負載均衡器,它提供對大量的HTTP和TCP客戶端的訪問控制。Feign也是用的Ribbon。

原理分析

ribbon實現的關鍵點是為ribbon定製的RestTemplate,ribbon利用了RestTemplate的攔截器機制,在攔截器中實現ribbon的負載均衡。負載均衡的基本實現就是利用applicationName從服務註冊中心獲取可用的服務地址列表,然後通過一定演算法負載,決定使用哪一個服務地址來進行http呼叫。

詳情可參考這篇文章 blog.csdn.net/qq_20597727…

使用

總體流程如下圖:

SpringCloud之服務呼叫

服務提供者

注:這裡需要有個服務註冊與發現的註冊中心,參考上一篇【SpringCloud之Eureka

建立一個服務提供者: 1.pom.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>cn.xbmchina</groupId>
		<artifactId>cloud-parent</artifactId>
		<version>1.0-SNAPSHOT</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>cn.xbmchina</groupId>
	<artifactId>cloud-eureka-client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>cloud-eureka-client</name>
	<description>一個服務提供者</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
複製程式碼

2.寫介面提供給外部呼叫 這裡用到@EnableEurekaClient註解,就是說將這個模組向eureka-server端註冊,以便其他模組可以發現該服務。


@SpringBootApplication
@EnableEurekaClient
@RestController
public class CloudEurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(CloudEurekaClientApplication.class, args);
	}

	@Value("${server.port}")
	String port;

	@RequestMapping("/hi")
	public String home(@RequestParam(value = "name", defaultValue = "zero") String name) {
		return "hi " + name + " ,i am from port:" + port;
	}
}
複製程式碼

3.配置檔案連線到eureka服務端 注:application.name=cloud-eureka-client在下面的其他模組呼叫時是有用處的。

server:
  port: 8762

spring:
  application:
    name: cloud-eureka-client

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
複製程式碼
服務消費者

使用ribbon版

1.pom.xml檔案,新增相關依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>cn.xbmchina</groupId>
		<artifactId>cloud-parent</artifactId>
		<version>1.0-SNAPSHOT</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>cn.xbmchina</groupId>
	<artifactId>cloud-service-ribbon</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>cloud-service-ribbon</name>
	<description>一個服務消費者</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>
	</dependencies>
</project>
複製程式碼

2.利用RestTemplate 呼叫CLOUD-EUREKA-CLIENT上面定義的服務提供介面 注: @LoadBalanced :是為了負載均衡用的。就是說你如果有幾臺機都是同一介面的話,它會輪流的呼叫。

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
@RestController
public class CloudServiceRibbonApplication {

	public static void main(String[] args) {
		SpringApplication.run(CloudServiceRibbonApplication.class, args);
	}


	@Bean
	@LoadBalanced  //負載均衡
	RestTemplate restTemplate() {
		return new RestTemplate();
	}

	@Autowired
	RestTemplate restTemplate;
	
	@GetMapping(value = "/hi")
	public String hi(@RequestParam String name) {
		return restTemplate.getForObject("http://CLOUD-EUREKA-CLIENT/hi?name="+name,String.class);
	}
}

複製程式碼

3.配置檔案連線到eureka服務端 注:application.name=cloud-eureka-client在下面的其他模組呼叫時是有用處的。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: cloud-service-ribbon
複製程式碼

使用Feign版 其實原理跟ribbon沒啥差異,與上面不同的地方:

  • 它是用介面來弄的
  • 使用註解@EnableFeignClients

1.pom.xml 依賴

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>
	</dependencies>
複製程式碼

2.在啟動類中加入@EnableFeignClients註解

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class CloudServiceFeginApplication {
	public static void main(String[] args) {
		SpringApplication.run(CloudServiceFeginApplication.class, args);
	}
}
複製程式碼

3.呼叫服務 注:這個是介面;@FeignClient中的值是服務端的名稱。

@FeignClient(value = "cloud-eureka-client")
public interface TestService {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String helloworld(@RequestParam(value = "name") String name);

}
複製程式碼

原始碼參考GitHub: github.com/xbmchina/cl…

總結

服務呼叫類似於用一個瀏覽器去呼叫伺服器的介面然後接收或傳遞資料進行下一步的處理,不過這裡是可以相互呼叫。 場景: 比如很多的電商網站有訂單模組,倉庫模組,支付模組等之間的相互呼叫。例如:生成訂單,然後倉庫模組減少,然後支付模組收到錢,接著通知倉庫模組安排配送等。

用SpringCloud的分開各個模組,各負其職,這就是微服務的意義之一。

最後

如果對 Java、大資料感興趣請長按二維碼關注一波,我會努力帶給你們價值。覺得對你哪怕有一丁點幫助的請幫忙點個贊或者轉發哦。

SpringCloud之服務呼叫

相關文章