springcloud超簡單的入門2--Eureka服務治理
阿新 • • 發佈:2019-09-14
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){ try { Thread.sleep(2010); } catch (InterruptedException e) { e.printStackTrace(); } 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); } }