Eureka是什麼?
- 服務注冊和發現。
- 隻要所有的服務注冊進Eureka中,大家可以直接去Eureka中找到服務名稱(辨別符),可以直接進行服務調用,不像dubbo還得修改配置檔案。
- 類似dubbo的注冊中心,比如zookeeper。
Eureka服務注冊中心建立
- 搭建項目eureka_service
- application.yml 現在隻是部署一台服務,使用單機模式
server: port: 7001 eureka: instance: hostname: localhost #eureka服務端的執行個體名稱 client: register-with-eureka: false #false表示不向注冊中心注冊自己 fetch-registry: false #false表示自己就是注冊中心,職責就是維護服務實力,并不需要檢索服務 service-url: #單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址(單機)。http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 啟動項配置@EnableEurekaServer
-
<!--eureka-server服務端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- 修改後立即生效,熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
微服務項目注冊進Eureka服務中心
- cloud_provider服務注冊到EureKa上
- cloud_provider的application.yml增加
eureka: client: service-url: defaultZone: http://localhost:7001/eureka instance: instance-id: cloud_provider8081 #在eureka上顯示自己設定的服務名稱 prefer-ip-address: true # 滑鼠移動在eureka上顯示自己的ip
- cloud_provider的啟動項增加@EnableEurekaClient
- cloud_provider的pom增加
<!-- eureka用戶端注冊需要引入 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 啟動cloud_provider和eureka_service,成功将cloud_provider注冊到eureka上
微服務主機映射名稱修改
- 需要修改的樣式圖
-
instance: instance-id: cloud_provider8081 #在eureka上顯示自己設定的服務名稱
微服務之際IP資訊修改
- 滑鼠移動到Eureka上微服務名稱上面,右下角有IP出現
- cloud-provider服務提供項目yml中增加:
prefer-ip-address: true # 滑鼠移動在eureka上顯示自己的ip
微服務info内容建構
- 滑鼠點選Eureka上微服務名稱,可以跳轉到一個info頁面,裡面有我們自己定義的資訊
- 父工程parent_project的pom增加
<build> <finalName>parent_project</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimit>$</delimit> </delimiters> </configuration> </plugin> </plugins> </build>
- cloud-provider服務提供者項目
info: app.name: cloud_procider_服務提供者 company.name: www.xiaoke.com build.artifactId: $project.artifactId$ build.version: $project.version$
- cloud-provider的pom
<!-- eureka 點選服務名稱跳轉頁面的内容監控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.9.RELEASE</version> </dependency>
Eureka自我保護機制
- 某一時刻微服務不可用了,Eureka不會立刻清理,依舊會堵蓋微服務的資訊進行儲存,Euraka不會盲目的登出任何健康的微服務或不健康的微服務,使用自我保護摩诃薩,可以讓Eureka叢集更加的健壯、穩定。(好死不如賴活着)
-
禁用自我保護模式,一般不推薦
eurka.server.enable-self-preservation = false
- 圖檔
Eureka服務發現
- 就是在服務提供方項目中暴露一個端口,供大家通路,檢視注冊到Eureka的服務資訊
- controller增加
@Autowired private DiscoveryClient discoveryClient; @RequestMapping(value = "/dept/discovery", method = RequestMethod.GET) public Object discovery() { List<String> list = discoveryClient.getServices(); System.out.println("**********" + list); List<ServiceInstance> srvList = discoveryClient.getInstances("CLOUD-PROVIDER"); for (ServiceInstance element : srvList) { System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t" + element.getUri()); } return this.discoveryClient; }
- 通路http://localhost:8081/dept/discovery格式
{ services: [ "cloud-provider" ], localServiceInstance: { host: "192.168.75.1", port: 8081, metadata: { }, serviceId: "cloud-provider", uri: "http://192.168.75.1:8081", secure: false } }
Eureka叢集配置
- 由于叢集是搭建在三個伺服器上,即:IP不一樣,本地為了墨迹更改hosts模拟三台機器。
127.0.0.1 www.one.com 127.0.0.1 www.two.com 127.0.0.1 www.three.com
- 搭建eureka_service_two,複制eureka_service所有配置
- 搭建eureka_service_three,複制eureka_service所有配置
- 更改hostsname, defaultZone
- eureka_service的yml
server: port: 7001 eureka: instance: hostname: www.one.com #eureka服務端的執行個體名稱 client: register-with-eureka: false #false表示不向注冊中心注冊自己 fetch-registry: false #false表示自己就是注冊中心,職責就是維護服務實力,并不需要檢索服務 service-url: #單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址(單機)。http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ defaultZone: http://www.two.com:7002/eureka/,http://www.three.com:7003/eureka//
- eureka_service_two的yml
server: port: 7002 eureka: instance: hostname: www.two.com #eureka服務端的執行個體名稱 client: register-with-eureka: false #false表示不向注冊中心注冊自己 fetch-registry: false #false表示自己就是注冊中心,職責就是維護服務實力,并不需要檢索服務 service-url: #單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址(單機)。http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ defaultZone: http://www.one.com:7001/eureka/,http://www.three.com:7003/eureka/
- eureka_service_three的yml
server: port: 7003 eureka: instance: hostname: www.three.com #eureka服務端的執行個體名稱 client: register-with-eureka: false #false表示不向注冊中心注冊自己 fetch-registry: false #false表示自己就是注冊中心,職責就是維護服務實力,并不需要檢索服務 service-url: #單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址(單機)。http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ defaultZone: http://www.one.com:7001/eureka/,http://www.two.com:7002/eureka/
- cloud-provider項目修改yml
eureka: client: service-url: defaultZone: http://www.one.com:7001/eureka
Eureka與Zookeeper好在哪裡
- CAP理論的核心是:一個分布式系統不可能同時很好的滿足一緻性,可用性,分區容錯這三個需求。
- CA - 單點叢集,滿足一緻性,可用性的系統,通常在可擴充性上不太強大。
- CP - 滿足一緻性,分區容錯性的系統,通常新跟那個不是特别高。
- AP - 滿足可用性,分區容忍性的系統,通常可能對一緻性要求低一些。
- 圖檔
- CA:關系型資料庫
- CP:非關系型資料庫、Zookeeper
- AP:Eureka
- Zookeeper如果有一台挂掉了,剩下的伺服器需要投票選擇一台主伺服器,為了保證資料正常穩定,會臨時停止服務,當投票選擇出一台主伺服器,才可以正常使用,中間造成服務不可用,影響業務系統,不适合高并發項目、電商購物項目。
- Eureka加入你有三台服務,每台都可以提供服務,服務共享,任何一台挂掉,其他的Eureka都可以正常使用。适合并發項目、電商購物項目。
git位址:[email protected]:Xiaokeworksveryhard/spring_cloud.git