SpringCloud--03、Eureka註冊中心
阿新 • • 發佈:2018-12-11
1、概述
ureka就好比是滴滴,負責管理、記錄服務提供者的資訊。服務呼叫者無需自己尋找服務,
而是把自己的需求告訴Eureka,然後Eureka會把符合你需求的服務告訴你。
同時,服務提供方與Eureka之間通過“心跳”機制進行監控,當某個服務提供方出現問題,Eureka自然會把它從服務列表中剔除。
最終實現:服務的自動註冊、發現、狀態監控
2、原理圖
- Eureka:就是服務註冊中心(可以是一個叢集),對外暴露自己的地址 - 服務提供者:啟動後向Eureka註冊自己資訊(地址,提供什麼服務) - 消費者:向Eureka訂閱服務,Eureka會將對應服務的所有提供者地址列表傳送給消費者,並且定期更新 - 心跳(續約):提供者定期通過http方式向Eureka重新整理自己的狀態
3、入門案例
建立工程、
匯入依賴、pom.xml
<?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>cloud-demo</artifactId> <groupId>com.baidus.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.baidus.demo</groupId> <artifactId>eureka-server</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project>
啟動類、EurekaDemoApp.java
package com.baidus.eureka.domain; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * @ Author :ShaoWei Sun. * @ Date :Created in 17:42 2018/12/1 */ @SpringBootApplication @EnableEurekaServer public class EurekaDemoApp { public static void main(String[] args) { SpringApplication.run(EurekaDemoApp.class,args); } }
全域性配置 applicaton.yml
server:
port: 10086 # 埠
spring:
application:
name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
client:
register-with-eureka: false # 是否註冊自己的資訊到EurekaServer,預設是true
fetch-registry: false # 是否拉取其它服務的資訊,預設是true
service-url: # EurekaServer的地址,現在是自己的地址,如果是叢集,需要加上其它Server的地址。
defaultZone: http://127.0.0.1:${server.port}/eureka
4、將user-service註冊到Eureka
註冊服務,就是在服務上新增Eureka的客戶端依賴,客戶端程式碼會自動把服務註冊到EurekaServer中。
在user-service中新增依賴
<!-- Eureka客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在user-service啟動類新增@EnableDiscoveryClient 、開啟Eureka客戶端功能
package com.baidus.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import tk.mybatis.spring.annotation.MapperScan;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 16:08 2018/12/1
*/
@SpringBootApplication
@MapperScan("com.baidus.user.mapper")
@EnableDiscoveryClient //開啟EurekaClient功能
public class UserApp {
public static void main(String[] args) {
SpringApplication.run(UserApp.class,args);
}
}
application.yml配置檔案
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: sswqzx
application:
name: user-service # 應用名稱
mybatis:
type-aliases-package: com.baidus.user.pojo
eureka:
client:
service-url: # EurekaServer地址
defaultZone: http://127.0.0.1:10087/eureka
instance:
prefer-ip-address: true # 當呼叫getHostname獲取例項的hostname時,返回ip而不是host名稱
ip-address: 127.0.0.1 # 指定自己的ip資訊,不指定的話會自己尋找
lease-expiration-duration-in-seconds: 10 #服務續約(renew)的間隔,預設為30秒
lease-renewal-interval-in-seconds: 5 #服務失效時間,預設值90秒
重啟:訪問:http://localhost:10087/
5、消費者從Eureka獲取服務
修改consumer-demo
新增依賴
<!-- Eureka客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
啟動類
@SpringBootApplication
@EnableDiscoveryClient // 開啟Eureka客戶端
public class UserConsumerDemoApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
public static void main(String[] args) {
SpringApplication.run(UserConsumerDemoApplication.class, args);
}
}
配置檔案application.yml
server:
port: 8080
spring:
application:
name: consumer # 應用名稱
eureka:
client:
service-url: # EurekaServer地址
defaultZone: http://127.0.0.1:10087/eureka
instance:
prefer-ip-address: true # 當其它服務獲取地址時提供ip而不是hostname
ip-address: 127.0.0.1 # 指定自己的ip資訊,不指定的話會自己尋找
service.java程式碼
@Service
public class UserService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;// Eureka客戶端,可以獲取到服務例項資訊
//如果用了robbin負載就有了負載均衡演算法、輪詢和隨機
public List<User> queryUserByIds(List<Long> ids) {
List<User> users = new ArrayList<>();
// String baseUrl = "http://localhost:8081/user/";
// 根據服務名稱,獲取服務例項
List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
// 因為只有一個UserService,因此我們直接get(0)獲取
ServiceInstance instance = instances.get(0);
// 獲取ip和埠資訊
String baseUrl = "http://"+instance.getHost() + ":" + instance.getPort()+"/user/";
ids.forEach(id -> {
// 我們測試多次查詢,
users.add(this.restTemplate.getForObject(baseUrl + id, User.class));
// 每次間隔500毫秒
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
return users;
}
}
重啟訪問:http://localhost/8081/consume?ids=1,2,3