【过程记录】springcloud配置使用Eureka作服务发现组件并进行微服务注册
- Eureka介紹
- 工具準備
- 步驟
- 編寫eureka server
- 編寫微服務應用:
- 查詢指定微服務在Eureka上的實例列表
- Eureka的自我保護模式
Eureka介紹
Eureka是Netflix開源的服務發現組件,本身是一個基于REST的服務。它包含Server和Client兩部分。Spring Cloud將它集成在子項目Spring Cloud Netflix中,從而實現微服務的注冊與發現。
Eureka包含兩個組件:Eureka Server和EurekaClient,它們的作用如下:
●Eureka Server提供服務發現的能力,各個微服務啟動時,會向Eureka Server注冊自己的信息(例如IP、端口、微服務名稱等),Eureka Server會存儲這些信息。
●EurekaClient是一個Java客戶端,用于簡化與Eureka Server的交互。
●微服務啟動后,會周期性(默認30s)地向Eureka Server發送心跳以續約自己的“租期”。
●如果Eureka Server在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將注銷該實例(默認90s)。
●默認情況下,Eureka Server同時也是EurekaClient。多個Eureka Server實例互相之間通過復制的方式來實現服務注冊表中數據的同步。
●EurekaClient會緩存服務注冊表中的信息。這種方式有一定的優勢——首先,微服務無須每次請求都查詢Eureka Server,從而降低了Eureka Server的壓力;其次,即使Eureka Server所有節點都宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者并完成調用。 綜上,Eureka通過心跳檢查、客戶端緩存等機制,提高了系統的靈活性、可伸縮性和可用性。
工具準備
IDEA、mysql、新建springboot項目、其他相關jar包
在maven官網都可以搜到。
步驟
編寫eureka server
1.新建兩個springboot工程文件(maven)
一個是eureka server
pom.xml
yml:
server:port: 8761 eureka:client:register-with-eureka: falsefetch-registry: falseserviceUrl.defaultZone: http://localhost:8761/eureka/●eureka.client.registerWithEureka:表示是否將自己注冊到EurekaServer,默認為true。由于當前應用就是Eureka Server,故而設為false。
●eureka.client.fetchRegistry:表示是否從Eureka Server獲取注冊信息,默認為true。因為這是一個單點的Eureka Server,不需要同步其他的Eureka Server節點的數據,故而設為false。
●eureka.client.serviceUrl.defaultZone:設置與EurekaServer交互的地址,查詢服務和注冊服務都需要依賴這個地址。默認是http://localhost:8761/eureka;多個地址間可使用,分隔。
運行啟動類:
@SpringBootApplication @EnableEurekaServer public class EurekaServiceApplication {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication.class, args);}}注意
●在Spring Cloud Edgware之前,要想將微服務注冊到Eureka Server或其他服務發現組件上,必須在啟動類上添加@EnableEurekaClient或@EnableDiscoveryClient。
●在SpringCloud Edgware以及更高版本中,只需添加相關依賴,即可自動注冊。這是由于在實際項目中,我們可能希望實現“不同環境不同配置”的效果,例如:在開發環境中,不注冊到EurekaServer上,而是服務提供者、服務消費者直連,便于調測;在生產環境中,我們又希望能夠享受服務發現的優勢——服務消費者無須知道服務提供者的絕對地址。為適應該需求,Spring Cloud Commons進行了改進,相關Issue:https://github.com/springcloud/spring-cloud-commons/issues/218.
啟動成功:
編寫微服務應用:
依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.h2database/h2 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.4.200</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>yml注冊到eureka的配置:
spring:application:name: clouddemo server:port: 8000 eureka:client:service-url:defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true# 表示將自己的IP注冊到eureka server,若不配置該屬性或設置為false則表示注冊微服務所在操作系統的hostname到eureka server數據庫配置:
spring.datasource.url=jdbc:mysql://localhost:3308/waimai?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8 spring.datasource.username=waimai spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql=true mybatis.type-aliases-package=com.example.springcloud.clouddemo.Entity其中mybatis.type-aliases-package=com.example.springcloud.clouddemo.Entity
用于mybatis映射,由于用的是注解的方式所以只寫這一句就好。
新建的數據表:
編寫實體類、dao、controller層:
entity
dao:
這里用的是注解的方式
controller:
@RestController public class UserController {@Autowiredprivate UserDao userDao;@GetMapping("/{Id}")public User findById(@PathVariable int Id) {System.out.println("fds");User findOne = userDao.SelectoneUser(Id);return findOne;} }啟動微服務后瀏覽器輸入
可以看見返回了正確的一條數據,可見微服務啟動成功。
然后刷新剛剛的eureka頁面:
可以看到已經成功注冊。
查詢指定微服務在Eureka上的實例列表
修改上面微服務應用的controller:添加以下語句
import org.springframework.cloud.client.discovery.DiscoveryClient;@RestController public class UserController {@Autowiredprivate UserDao userDao;@GetMapping("/{Id}")public User findById(@PathVariable int Id) {System.out.println("fds");User findOne = userDao.SelectoneUser(Id);return findOne;}@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/user")public List<ServiceInstance> showInfo(){return this.discoveryClient.getInstances("clouddemo");} }discoveryClient.getInstances可以用于查詢指定微服務在eureka上的實例列表
打開瀏覽器:
Eureka的自我保護模式
進入自我保護模式最直觀的體現,是EurekaServer首頁輸出的警告,如圖
Eureka Server自我保護模式界面 默認情況下,如果EurekaServer在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將注銷該實例(默認為90s)。但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該注銷這個微服務。 Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,不再刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當網絡故障恢復后,該Eureka Server節點會自動退出自我保護模式。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation=false禁用自我保護模式。
●Eureka與ZooKeeper做服務發現的對比:http://dockone.io/article/78.
在Status一欄有個UP,表示應用程序狀態正常。應用狀態還有其他取值,例如DOWN、OUT_OF_SERVICE、UNKNOWN等。只有標記為“UP”的微服務會被請求。 前文講過,EurekaServer與EurekaClient之間使用心跳機制來確定EurekaClient的狀態,默認情況下,服務器端與客戶端的心跳保持正常,應用程序就會始終保持“UP”狀態。
總結
以上是生活随笔為你收集整理的【过程记录】springcloud配置使用Eureka作服务发现组件并进行微服务注册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构笔记】B树和B+树的实现,哈希
- 下一篇: 【练习】树(Tree, UVa 548)