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。