基本結(jié)構(gòu)
注冊(cè)中心:EurekaServer
注冊(cè)中心提供服務(wù)的注冊(cè)和查詢能力服鹅。服務(wù)提供方:HelloWorldService
服務(wù)提供方實(shí)現(xiàn)業(yè)務(wù)邏輯讯赏,并將暴露的接口注冊(cè)到注冊(cè)中心棍好。服務(wù)消費(fèi)方:DemoConsumer
服務(wù)消費(fèi)方從注冊(cè)中心查詢到服務(wù)提供方的相關(guān)信息彬祖,然后直接訪問(wèn)服務(wù)提供方獲取相關(guān)服務(wù)协怒。
EurekaServer
本身也是一個(gè)SpringBoot應(yīng)用前标,啟動(dòng)后成為服務(wù)注冊(cè)中心坠韩,支持多節(jié)點(diǎn)集群,本示例使用單節(jié)點(diǎn)炼列。
配置文件 application.properties
# 設(shè)置spring應(yīng)用命名只搁,可以自定義,非必要
spring.application.name=eureka-server
# 設(shè)置Eureka Server WEB控制臺(tái)端口俭尖,自定義
server.port=8761
#是否將自己注冊(cè)到Eureka-Server中氢惋,默認(rèn)的為true
eureka.client.registerWithEureka=false
#是否從Eureka-Server中獲取服務(wù)注冊(cè)信息,默認(rèn)為true
eureka.client.fetchRegistry=false
Maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
啟動(dòng)注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
HelloWorldService
實(shí)際上這個(gè)服務(wù)就是一個(gè)標(biāo)準(zhǔn)的SpringBoot Web應(yīng)用,可以部署多個(gè)明肮,使用時(shí)由注冊(cè)中心按指定規(guī)則進(jìn)行選擇菱农。
配置文件 application.properties
# 對(duì)外提供Web服務(wù)的端口號(hào)
server.port=8762
# 服務(wù)注冊(cè)ID,使用該ID可以從注冊(cè)中心獲取服務(wù)實(shí)例
spring.application.name=hello-world-service
# 要注冊(cè)到的注冊(cè)中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
Maven依賴
<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>
服務(wù)代碼
@RestController
@SpringBootApplication
public class HelloWorldApplication {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello() {
return "Hello guy!";
}
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
DemoConsumer
這個(gè)應(yīng)用和之前的HelloWorldService
應(yīng)用在配置和Maven依賴上基本一致柿估,區(qū)別就是在代碼中增加了從注冊(cè)中心獲取服務(wù)實(shí)例的部分循未。
使用DiscoveryClient
獲取服務(wù)實(shí)例
@Autowired
private DiscoveryClient discoveryClient;
/**
* 調(diào)用DiscoveryClient獲取服務(wù)實(shí)例列表,取第一個(gè)服務(wù)實(shí)例
* @return
*/
@RequestMapping(value = "/discovery", method = RequestMethod.GET)
public String discoveryHello() {
ServiceInstance si = this.discoveryClient.getInstances(serviceId).get(0);
return sayHello(si);
}
使用LoadBalancerClient
獲取服務(wù)實(shí)例
/**
* ribbon負(fù)載均衡器秫舌,其中記錄了從Eureka Server中獲取的所有服務(wù)信息的妖。
* 這些服務(wù)的信息是IP和端口等。應(yīng)用名稱足陨,域名嫂粟,主機(jī)名等信息。
*/
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 調(diào)用LoadBanlanceClient獲取服務(wù)實(shí)例墨缘,choose策略見配置文件
* @return
*/
@RequestMapping(value = "/balance", method = RequestMethod.GET)
public String balanceHello() {
ServiceInstance si = this.loadBalancerClient.choose(serviceId);
return sayHello(si);
}
ribbon選擇策略可以在配置文件中進(jìn)行配置星虹,注意是按服務(wù)進(jìn)行單獨(dú)策略配置的
# 設(shè)置負(fù)載均衡策略
hello-world-service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
其它
這三個(gè)應(yīng)用由于存在依賴關(guān)系,因此啟動(dòng)需要按順序镊讼,首先需要啟動(dòng)EurekaServer宽涌,然后啟動(dòng)HelloWorldService注冊(cè)服務(wù),最后啟動(dòng)DemoConsumer蝶棋。
源碼已上傳到碼云:com.apollo.microService.demo