上次說了單體架構和微服務之前優缺點的對比,也說了zookeeper和Eureka理論上的區別,也說了Eureka高水平的架構。Eureka Server 和Eureka Client也就是消費者和生產者的的關係。 原始碼:https://github.com/limingios/netFuture/tree/master/原始碼/『網際網路架構』軟體架構-Eureka使用(92)/
(一)Eureka分割槽的概念
region使用者量比較大或者使用者地理位置分佈範圍很廣的專案,一般都會有多個機房。這個時候如果上線springCloud服務的話,我們希望一個機房內的服務優先呼叫同一個機房內的服務,當同一個機房的服務不可用的時候,再去呼叫其它機房的服務,以達到減少延時的作用。
eureka提供了region和zone兩個概念來進行分割槽,這兩個概念均來自於亞馬遜的AWS:
zone可以簡單理解為地理上的分割槽,比如亞洲地區,或者華北地區,再或者北京等等,沒有具體大小的限制。根據專案具體的情況,可以自行合理劃分region。
可以簡單理解為region內的具體機房,比如說region劃分為北京,然後北京有兩個機房,就可以在此region之下劃分出zone1,zone2兩個zone。
(三)Eureka簡單搭建
EurekaServerpom 配置,加入spring cloud父POM及spring-cloud-starter-eureka-server。
server.port=8761#取消向eureka server(註冊中心)註冊eureka.client.register-with-eureka=false#取消向eureka server(註冊中心)獲取註冊資訊eureka.client.fetch-registry=false#eureka 提供服務發現的地址eureka.client.service-url.defaultZone=http://idig8:777@localhost:8761/eureka#eureka.client.service-url.defaultZone=http://localhost:8761/eureka# 安全模組security.basic.enabled=truesecurity.user.name=idig8security.user.password=777啟動類
pom.xml
spring.application.name=microservice-orderserver.port=8082## db configspring.datasource.url=jdbc:mysql://localhost:3306/springcloudspring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driver## loglogging.level.root=INFOlogging.level.org.springframework.web=DEBUGlogging.level.com.tuling.springcloud=DEBUG#eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/eureka.client.serviceUrl.defaultZone=http://zhangfei:777@localhost:8761/eurekaeureka.instance.prefer-ip-address=trueeureka.instance.instance-id=${spring.application.name}:${spring.application.instance_id:${server.port}}
controller
package com.tuling.springcloud.api;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestController@RequestMapping("/order")public class OrderController { private final Logger logger = LoggerFactory.getLogger(OrderController.class); @Autowired private RestTemplate restTemplate; //http://localhost:8082/order/user/getById?userId=1 @RequestMapping("/user/getById") public Object getUserById(String userId) { String url = "http://localhost:8081/user/getById?id=" + userId; logger.debug("param userId : {}, request url : {}", userId, url); Object result = restTemplate.getForEntity(url, Object.class); return result; } @RequestMapping("/user/getByIdEureka") public Object getUserByIdEureka(String userId) { String url = "http://microservice-user/user/getById?id=" + userId; Object result = restTemplate.getForEntity(url, Object.class); return result; } }
啟動類
package com.tuling.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication@EnableDiscoveryClientpublic class OrderMicroStart { public static void main(String[] args) throws Exception { SpringApplication.run(OrderMicroStart.class, args); }}
(三)Eureka重要概念
Register 服務註冊Renew 服務的續期Fetch Registers : 獲取註冊列表資訊Eviction 服務剔除Cancel: 服務下線按照這個思路去觀看原始碼
PS:eureka在springcloud中充當服務註冊功能,相當於dubbo+zk裡面得zk,但是比zk要簡單得多,zk可以做得東西太多了,包括分散式鎖,分散式佇列都是基於zk裡面得四種節點加watch機制通過長連線來實現得,但是eureka不一樣,eureka是基於HTTPrest來實現的,就是把服務的資訊放到一個ConcurrentHashMap中,然後服務啟動的時候去讀取這個map,來把所有服務關聯起來,然後伺服器之間呼叫的時候通過資訊,進行http呼叫。eureka包括兩部分,一部分就是服務提供者(對於eureka來說就是客戶端),一部分是服務端,客戶端需要每個讀取每個服務的資訊,然後註冊到服務端,很明顯了,這個服務端就是接受客戶端提供的自身的一些資訊。