Eureka服務治理 下麵請聽第一個話題,母。。。咳咳,拿錯書了。 Eureka簡介 eureka是什麼呢? 簡單來說呢,當我的微服務應用多了起來,一個一個寫死再程式里是件很不優雅的事情,而且同一服務可能會多個實例存在,來對服務分流,就是負載均衡。 所以,我們需要一個位置來存放服務的訪問列表,以供消 ...
Eureka服務治理
下麵請聽第一個話題,母。。。咳咳,拿錯書了。
Eureka簡介
eureka是什麼呢?
簡單來說呢,當我的微服務應用多了起來,一個一個寫死再程式里是件很不優雅的事情,而且同一服務可能會多個實例存在,來對服務分流,就是負載均衡。
所以,我們需要一個位置來存放服務的訪問列表,以供消費端來使用,這個東西呢,就可以用eureka來實現。
我們來看一下eureka的相關概念:
相關概念
服務註冊(Register)
eureka客戶端向Eureka伺服器註冊時,它提供自身的元數據,比如IP地址,埠信息
服務續約(Renew)
客戶端每隔30秒發送一次心跳來進行服務續約。
服務下線(Cancel)
客戶端在程式關閉時向伺服器發送取消請求,成功該實例將會從伺服器註冊列表中刪除
服務剔除(Eviction)
預設情況下,當客戶端連續90秒沒有發送心跳請求,伺服器就會將該服務實例從服務列表中刪除,剔除該服務
獲取服務註冊列表信息(Fetch Registriers)
客戶端從伺服器獲取服務註冊列表信息,並將其緩存在本地。列表信息定期(30秒)更新一次。
不太理解也沒關係,我們可以先把架子搭建起來,之後慢慢悟把。
Eureka角色
Eureka中存在三種角色,註冊中心,服務提供者,服務消費者。
其中註冊中心是Eureka服務端,服務提供者與服務消費者都是客戶端。
註冊中心伺服器
主要進行,服務註冊,服務續約和服務下線。就是維護服務列表的東東啦。
讓我們一步一步的開始把
- 相關依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 啟動類配置,使用
@EnableEurekaServer
註解,啟用Eureka服務
@SpringBootApplication @EnableEurekaServer public class EurekacenteralApplication { public static void main(String[] args) { SpringApplication.run(EurekacenteralApplication.class, args); } }
- 屬性配置
server: port: 9090 ##UI界面埠 eureka: instance: hostname: localhost ##主機名稱 client: register-with-eureka: false ##是否註冊到服務中心,因為本身就是服務中心,不需要註冊 fetch-registry: false ##是否發現服務 service-url: ##註冊中心服務地址 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動服務,這樣一個簡單的註冊中心就啟動起來,瀏覽器訪問http://localhost:9090 就可以看到eureka的監控界面了。
服務提供者
eureka客戶端,向外提供服務
- 相關依賴,作為Euraka客戶端
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 啟動類配置,使用
@EnableEurekaClient
註解,啟動Eureka客戶端
@SpringBootApplication @EnableEurekaClient public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } }
- 屬性配置(單機時可以通過設置不同埠,來啟動多個服務)
server: port: 8080 eureka: instance: prefer-ip-address: true ##使用IP註冊服務 client: register-with-eureka: true #預設就是true,可以不用設置 fetch-registry: true #預設是true,可以不用設置 service-url: defaultZone: http://localhost:9090/eureka/ spring: application: name: microservice-provider
- 服務介面
@RestController @RequestMapping("/") public class TestController { @GetMapping("hi/{name}") public String hi(@PathVariable String name, HttpServletRequest request){ return "hi,welcome "+name+" from port:"+request.getServerPort(); } }
服務消費者
本質上與提供者為同一類客戶端,會在本地緩存一份服務列表信息,會定期更新緩存
- 相關依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 啟動類配置
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
- 屬性配置
server: port: 8090 eureka: client: service-url: defaultZone: http://localhost:9090/eureka/ register-with-eureka: false ##僅僅作為消費者 fetch-registry: true #預設是true,可以不用設置 ## 多說幾句,服務者跟消費者不是絕對的,他們可以同時作為兩種角色存在 ## register-with-eureka: true ## fetch-registry: true ## 當這兩個熟悉都為true的時候,就可以作為兩種角色同時存在了,即可以作為提供者,向外提供服務 ## 又可以作為消費者,消費服務
- 服務消費,都在代碼里,我幹了,你隨意。
@RestController @RequestMapping("/") public class TestController { // 服務只有一個實例運行的時候,一個服務提供者, // 就算不註冊到eureka,我們也可以使用這種方式就行調用 @Resource RestTemplate restTemplate; @GetMapping("hi") public String hi() { return restTemplate.getForObject("http://localhost:8090/hi/consumer", String.class); } //當服務有多個實例的時候,我們就可以使用服務發現或獲取服務列表,並取其中一個實例進行調用 // 這樣才是實際場景,當然還用更簡潔的使用方式,我們下次說 @Resource DiscoveryClient discoveryClient; //通過服務發現,獲取註冊中心上註冊的服務,獲取調用地址,然後調用服務 @GetMapping("hi2") public String hi2() { List<ServiceInstance> serviceInstances = discoveryClient .getInstances("microservice-provider"); if (serviceInstances.size() == 0) return "service has down"; // 這裡就是取第一個服務來消費 return restTemplate.getForObject(String.format("%s/hi/consumer", serviceInstances.get(0).getUri()), String.class); } }