注意!!!
這是對上一篇博客 springcloud的延續,整個項目的搭建,來源與上一篇博客。
一、什么是eureka? // eureka是一個注冊中心,實現了dubbo中zookeeper的效果! 二、實現eureka工程的搭建? 1.1 單節點版 1.1 zookeeper 和 eureka的區別? /* 1. zookeeper不會把自己注冊到注冊中心,但是eureka會! 2. 配置eureka 需要配置不能把自己注冊到注冊中心里面。 3. consumer 也不能把自己注冊到注冊中心。 4. 只要provider可以。 */ 1.2 創建eureka工程 20190926-springcloud-eureka-management(pom):只管理jar包
子級項目 --20190926-springcloud-eureka-7081(jar):運行了eureka 1.3 jar包的添加 所有的eureka都只會用到一個jar包 eureka並不是springcloud公司的,是Netflix公司的產品,目前springcloud正在開發完善的springcloud架構來代替Netflix所提供的組件 雖然eureka的工程構建仍然需要使用springboot,但是不再需要springboot-web-starter的jar包,因為eureka的jar包中已經有了 // !!!!!如果添加則出現jar包沖突 eureka的jar包添加只需要在父工程中添加即可,所有的子工程都可以繼承父工程的jar包 springcloud官網中提供的springcloud2.x版本所規定的jar包格式: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> 1.4 eureka整個開發中,不涉及任何與業務有關的代碼 /* application.properties ApplicationRun.java @SpringBootApplication @EnableEurekaServer */ 1.5 把provider-8081注冊進eureka中 /* 在配置zookeeper的時候,無論是服務消費者還是服務生產者,都引入zookeeper的jar包(zkClinet) 在配置eureka的時候,需要引入么? !!很需要!! <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> */ 修改application.properties配置文件 在講zookeeper的時候,zk.address=zookeeper的ip地址 現在使用eureka的時候,也需要eureka的地址(eureka的項目地址) eureka.client.service-url.defaultZone=http://localhost:7081/eureka 在provider-8081項目的主啟動類上添加注解 @EnableDiscoveryClient: springcloud2.x的版本注解 @EnableEurekaClient: springcloud1.x的版本注解 1.6 配置eureka服務的信息(actuator-info) // 為什么要配置? 雖然目前eureka注冊中心中只有一個服務,但是在真實開發環境中可能有很多個(35個) 每一個團隊/team是有多個人組成的,每一個開發人員開發的功能是不同的, eg: 電商 cart微服務:zhangsan開發 order微服務:lisi開發 portal微服務:wangwu開發 這些微服務最終都需要注冊進eureka中 假設zhangsan所開發的cart微服務出現問題了,這個問題是lisi發現的 如果其中有一個服務出現問題,這個服務正好是自己開發的,但是最終lisi看不到主要信息,直接描述不清楚,這種情況是絕對不允許在團隊中出現! /* 在provider-8081項目的application.properties中進行配置 配置eureka的實例名(Status下面所顯示的名字) 不允許出現任何的重復! eureka.instance.instance-id=雖然可以隨意起,但是要求描述出整個微服務的作用 */ 當鼠標移動到服務名的時候,只會顯示localhost,但是根據localhost並不能精准的定位到哪一台服務器,需要把localhost改為IP地址 # 在eureka中顯示IP地址 // eureka.instance.prefer-ip-adderss=true 配置完畢后顯示並不是本機的ip地址 provider的ip地址顯示是相對於eureka做的內網映射 在eureka的整個注冊中心里會指定內部的ip地址,必須要使provider和eureka在同一個內網中, 一旦provider成功的注冊進了eureka,那么eureka就會給provider分配一個自己的內網ip // 每一台電腦是有兩個IP的,一個是公網IP,一個是內網IP 實現點擊服務名顯示具體的服務信息 先添加jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> // 在provider-8081項目的application.properties配置文件中添加: info.author.name=Seven Lee info.company.name=AAA SOFTWARE EDU info.project.description=This is Demo 1.7 eureka的自我保護機制? 如果長時間不連接(不激活)eureka的時候,會出現自我保護機制,在eureka頁面上會顯示: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE. /* 為什么會出現自我保護: 有沒有可能網絡阻塞(網絡非常卡),如果發生后,eureka就檢測不到provider的心跳 eureka中有200個provider,如果只有3個provider沒有心跳,eureka就會直接把這三台直接剔除 但是如果有198個provider都沒有心跳,則eureka就不會再剔除,也就是說直接會保留這198個provider */ 1.8 什么是eureka的AP性? 在eureka中注冊過的服務會定時向eureka發送心跳 當網絡故障/網絡延遲/服務宕機就不會再向eureka發送心跳,eureka從接不到心跳的那一秒開始算起,(90秒)之后會直接把這個服務給剔除 因為provider的機房停電了,大面積的provider都無法向eureka發送心跳,90秒之后還是沒有接收到心跳, eureka就不會再剔除任何一個服務(也就是說會把全部的服務都保留下來)(這個就是eureka的AP性) /* 為什么eureka不會剔除大量的服務? AP:只保證了服務的可用性,不保證數據的一致性 CP:只保證了數據的一致性,不保證服務的可用性 如果eureka把所有的服務全部剔除,當consumer進行訪問調用的發現eureka中並沒有任何服務了,整個項目都會處於癱瘓狀態,整個客戶端的體驗就會非常差,也就是說相當於報錯500! 如果當大面積服務都沒有心跳,eureka不剔除的情況下,consumer進行訪問調用的時候依然可以找到所注冊服務,然后就可以直接獲取到數據,這些數據可能不是最新的數據! */ 1.9 如何關閉eureka的自我保護機制: !!可以關閉!!但是不能這么做!! 在eureka-7081項目的application.properties配置文件中 // eureka.server.enable-self-preservation=false(!!關閉eureka的自我保護機制!!) 提示一下信息: THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS. 現在某些微服務就是不需要eureka的自我保護,就想辦法把自我保護機制失效 provider告訴eureka,我每個5秒會向你發送一次心跳,當最后一次檢測我的時間之后過了8秒還沒有接收到心跳直接把我剔除! 在eureka-7081的application.properties配置文件中添加 # eureka自己檢測服務的心跳時間(90秒) # 單位是毫秒,先把eureka檢測心跳的時間縮短為10秒 # 也就是說每個10秒就會檢測一次服務的心跳 // eureka.server.eviction-interval-timer-in-ms=10000 在provider-8081的application.properties配置文件中添加 # 規定自己向eureka發送心跳的時間 # 單位是秒 // eureka.instance.lease-renewal-interval-in-seconds=5 # 當eureka最后一次檢測到心跳的時間間隔(單位是秒) # eg:15:05:20是最后一次檢測到心跳-->檢測8秒之后還是無法檢測心跳的時候直接剔除 // eureka.instance.lease-expiration-duration-in-seconds=8 2.集群版 (正宗的eureka!)
二、eureka項目jar包的添加,和相關配置文件?
2.1 20190927-springcloud-eureka-management父級項目的 jar包
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>20190927-springcloud-parent</artifactId> <groupId>com.aaa</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.aaa</groupId> <artifactId>20190927-springcloud-eureka-management</artifactId> <packaging>pom</packaging> <modules> <module>20190927-springcloud-eureka-7081</module> </modules> <!-- eureka的jar包添加只需要在父工程中添加即可,所有的子工程都可以繼承父工程的jar包 springcloud官網中提供的springcloud2.x版本所規定的jar包格式: --> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project>
2.2 把provider-8081注冊進eureka中 的文件配置?
server.port=8081 server.servlet.context-path=/ spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 我的數據庫編碼的問題 所以需要添加 characterEncoding=utf8 設置自字符集。 spring.datasource.url=jdbc:mysql://localhost:3306/qy100?characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.type=com.alibaba.druid.pool.DruidDataSource mybatis.type-aliases-package=com.aaa.zxf.model mybatis.mapper-locations=classpath:mapper/*Mapper.xml #三、 # 配置的是在eureka中顯示的服務名(Application) # 如果不配置,則會顯示UNKNOWN(這個是細節!!,以后有問題) spring.application.name=user-provider #一、 #配置eureka 的注冊地址,將provider 注冊進來。 # 單節點模式,eureka的命名空間是 defaultZone # 客戶端的命名空間可以隨意指定,就算不一致,也可以注冊進eureka 。因為單節點只有 #一台eureka, 此時的命名空間是失效的。 #二、 注意! # GreenWich RS.3:無論是單點解還是集群模式,eureka的服務器端和客戶端的命名空間必要保持一致,否則會報錯(找不到服務實例) #eureka.client.service-url.defaultZone=http://localhost:7081/eureka eureka.client.service-url.defaultZone=http://localhost:7081/eureka #四 #在eureka中配置實例, 就是eureka的status下顯示的名字 # 不可以重復!!! 等同於mysql中表的id。 eureka.instance.instance-id=user-provider-8081 #五、 #在eureka中顯示ip的地址 eureka.instance.prefer-ip-address=true #六 點擊eureka的服務名顯示出該服務的具體信息 # 根據服務的具體內容,作者,公司,以及對整個服務的描述來進行顯示 # 相當於在HTML頁面上有一個a標簽<a href="/actuator/info"></a> --> 跳轉到controller:@RequestMapping("/actuator/info") # !!開頭用info!!其他的隨便輸入 info.autor.name=ZhouXu info.company.name=AAA info.project.desription=This is Demo #七 現在某些微服務就是不需要eureka的自我保護,就想辦法把自我保護機制失效 # 規定自己向eureka發送心跳的時間 單位是秒 eureka.instance.lease-renewal-interval-in-seconds=5 #eureka.instance.lease-renewal-interval-in-seconds=5 # 當eureka最后一次檢測到心跳的時間間隔(單位是秒) # eg:15:05:20是最后一次檢測到心跳-->檢測8秒之后還是無法檢測心跳的時候直接剔除 eureka.instance.lease-expiration-duration-in-seconds=8
provide-8081啟動類添加注解。
package com.aaa.zxf; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * * 將provider 注冊到 eureka 需要添加注解 * @EnableDiscoveryClient */ @SpringBootApplication @MapperScan("com.aaa.zxf.mapper") @EnableDiscoveryClient public class ApplicationRun8081 { public static void main(String[] args) { SpringApplication.run(ApplicationRun8081.class,args); } }
2.3 eureka服務的信息配置?
20190927-springcloud-eureka-7081子級項目(jar)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>20190927-springcloud-provider-management</artifactId> <groupId>com.aaa</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>20190927-springcloud-provider-8081</artifactId> <dependencies> <dependency> <groupId>com.aaa</groupId> <artifactId>20190927-springcloud-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 實現點擊服務名顯示具體的服務信息的jar包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
7081的application.properties配置。
# 一、
#eureka 注冊中心的相關配置
server.port=7081
server.servlet.context-path=/
#二、
# eureka 服務器端的實例名稱 唯一的!
#就是給 eureka 起了一個名字。 不可亂起。
#hostname就是本台服務器的域名,不配置就是localhost
eureka.instance.hostname=localhost
#三、
# 設置eureka 不要將自己注冊到注冊中心里面。
# eureka默認也會把自己注冊到注冊中心里,這里因為最終eureka是不需要被consumer所發現的,所以不再需要把自己注冊里面,eureka自己就是注冊中心
# 它是對整個服務的管理起作用,並不是一個服務提供者,所以不應該把自己注冊到注冊中心里
# 默認值為true,需要把默認值改成false
eureka.client.register-with-eureka=false
#四、
# 設置eureka 不要在注冊中心 發現自己
# eureka的職責是維護服務的實例,表明自己就是注冊中心,並不需要從注冊中心里發現自己
# 默認值為true,需要手動改為false
eureka.client.fetch-registry=false
#五、
#1. eureka的指向地址
# zookeeper需要在linux服務器上進行配置,最終的情況下使用zookeeper的時候必須要指向zookeeper的IP地址
#eureka不需要做任何服務器配置,但是也必須要指向地址(直接指向eureka的項目即可:http://localhost:7081/eureka)
#2. localhost
# 該地址中的localhost就是eureka.instance.hostname的值,端口號就是server.port的值,/eureka:固定的(eureka自己提供)
# defaultZone:eureka默認所提供的命名空間
# 在eureka的注冊地址中,是可以分空間(zone)的,是命名空間,根據空間的不同來配置不同集群的eureka來實現不同的作用
# eureka不需要linux服務器,但是eureka怎么知道自己和其他的服務器是一個集群呢?
# eg:電商項目
# order項目-->服務的提供者和服務的消費者
# cart項目-->服務的提供者和服務的消費者
# item項目-->服務的提供者和服務的消費者
# manager項目-->服務的提供者和服務的消費者
# userInfo項目-->服務的提供者和服務的消費者
# 就可以根據類別進行配置eureka
# eureka01和eureka02的命名空間就是:order
# eureka03和eureka04的命名空間就是:cart
# 為了提供整個項目的安全性和可維護性
#3. 單節點的配置
# 如果為單節點可以隨意配置,但是如果為集群則目前為止必須要配置成defaultZone(因為如果是集群版就必須先要聲明命名空間,如果不聲明則無法使用)
eureka.client.service-url.defaultZone=http://localhost:7081/eureka
#六
#關閉eureka的自我保護機制:
#!!可以關閉!!但是不能這么做!!
#eureka.server.enable-self-preservation=false
#七 現在某些微服務就是不需要eureka的自我保護,就想辦法把自我保護機制失效
#1. provider告訴eureka,我每個5秒會向你發送一次心跳,當最后一次檢測我的時間之后過了8秒還沒有接收到心跳直接把我剔除!
#2. eureka自己檢測服務的心跳時間(90秒)
# 單位是毫秒,先把eureka檢測心跳的時間縮短為10秒
# 也就是說每個10秒就會檢測一次服務的心跳
eureka.server.eviction-interval-timer-in-ms=10000
#eureka.server.eviction-interval-timer-in-ms=10000
7081的啟動類
package com.aaa.zxf; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * 關於注解? * @EnableEurekaServer: 就是開啟eureka的服務器端 * * @EnableEurekaClient: !!!!不讓用!!!!(springcloud1.x的注解) */ @SpringBootApplication @EnableEurekaServer public class ApplicationRun7081 { public static void main(String[] args) { SpringApplication.run(ApplicationRun7081.class,args); } }
圖解單節點