1. 程式人生 > >Spring Cloud 學習筆記二(服務發現與消費)

Spring Cloud 學習筆記二(服務發現與消費)

配置高可用註冊中心 Eureka Server 的高可用就是指將服務註冊中心本身向其他服務註冊中心註冊自己,這樣就可以實現服務清單的同步,增強系統可用性,而不是單節點的服務註冊中心。 在學習筆記一里,我們設定過如下兩個引數

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

既然需要向其他服務中心註冊自己,那麼這兩個引數我們就不需要配置,預設true。 我們在學習筆記一的基礎上,構建一個雙節點的註冊中心叢集。 分別建立application-peer1.properties和application-peer2.properties兩個配置檔案,配置內容如下:

peer1:
server.port=1130

spring.application.name=eureka-server

eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:1131/eureka/

peer2:
server.port=1131

spring.application.name=eureka-server

eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:1130/eureka/

這裡peer1和peer2分別向對方註冊自己。為了讓上面的host形式的URL能正確訪問到,我們需要新增對peer1和peer2的轉換。 linux在/etc/hosts檔案,windows在c:\windows\system32\drivers\etc\hosts檔案

127.0.0.1 peer1
127.0.0.1 peer2 

然後利用Profile配置分別啟動這兩個服務,

java -jar eureka-server-1.0.jar --spring.profiles.active=peer1
java -jar eureka-server-1.0.jar --spring.profiles.active=peer2

啟動之後我們開啟localhost:1130,效果如下: 在這裡插入圖片描述 可以看到在peer1的註冊節點中,已經有了peer2。 至於服務提供方,我們還是以筆記一種的hello-service為例,只要改動如下配置

eureka.client.serviceUrl.defaultZone=http://peer1:1130/eureka/,http://peer2:1131/eureka/

可以觀察到,此時hello-service同時註冊到了兩個服務中心。

服務發現與消費 現在已經有了服務註冊中心與服務提供者,接下來我們應該做的就是發現服務並消費服務。建立一個Spring Boot工程,名為ribbon-consumer,在pom檔案中引入:

		<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>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

在應用主類中新增如下程式碼:

@EnableDiscoveryClient // 讓應用註冊為Eureka客戶端應用,以獲得發現服務的能力,
@SpringBootApplication
public class RibbonConsumerApplication {

	@Bean
	@LoadBalanced // 開啟客戶端負載均衡
	RestTemplate restTemplate() {
		return new RestTemplate();
	}

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

建立ConsumerController類

@RestController
public class ConsumerController {

	@Autowired
	private RestTemplate restTemplate;

	@RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
	public String helloConsumer() {
		return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
	}
}

其中訪問路徑為 而不是具體的IP地址,這也符合我們的預期要求,符合服務治理的概念。 在application.properties在配置如下:

spring.application.name=ribbon-consumer

server.port=9000

eureka.client.serviceUrl.defaultZone=http://peer1:1130/eureka/

啟動應用之後,我們可以在1130與1131中都可以看到當前的註冊服務,這與我們的高可用服務註冊中心相關 在這裡插入圖片描述 在這裡插入圖片描述

此時,我們通過http://localhost:9000/ribbon-consumer訪問,將會得到資訊的返回。這個適合檢視ribbon-consumer的控制檯,我們可以檢視到當前客戶端維護的HELLO-SERVICE服務列表,以及其他一些也極為有用的資訊。 在這裡插入圖片描述

我們再多請求幾次,就會發現1993 1994兩個HELLO-SERVICE的控制檯,會交替列印輸出日誌,這也證明了當前客戶端的呼叫是基於負載均衡的,我們關閉了其中一個服務(1993),會發現,客戶端仍然能有效呼叫HELLO-SERVICE。 在這裡插入圖片描述