Eureka使用小案例


Eureka架構中的三個核心角色:

  • 服務註冊中心:Eureka的服務端應用,提供服務註冊和發現功能
  • 服務提供者:提供服務的應用,可以是SpringBoot應用,也可以是其它技術實現,只要對外提供的是Rest風格服務即可。
  • 服務消費者:消費應用從註冊中心獲取服務列表,從而得知每個服務方的信息,知道去哪裏調用服務方。

Eureka就好比是滴滴,負責管理、記錄服務提供者的信息。服務調用者無需自己尋找服務,而是把自己的需求告訴Eureka,然後Eureka會把符合你需求的服務告訴你。Eureka說白了就是一個註冊服務中心。

同時,服務提供方與Eureka之間通過“心跳”機制進行監控,當某個服務提供方出現問題,Eureka自然會把它從服務列表中剔除。

這就實現了服務的自動註冊、發現、狀態監控。

原理圖

å¨è¿éæå¥å¾çæè¿°

  • Eureka:就是服務註冊中心(可以是一個集羣),對外暴露自己的地址
  • 提供者:啓動後向Eureka註冊自己信息(地址,提供什麼服務)
  • 消費者:向Eureka訂閱服務,Eureka會將對應服務的所有提供者地址列表發送給消費者,並且定期更新
  • 心跳(續約):提供者定期通過http方式向Eureka刷新自己的狀態

入門案例
1.編寫EurekaServer
接下來我們創建一個項目,啓動一個EurekaServer,依然使用spring提供的快速搭建工具:

å¨è¿éæå¥å¾çæè¿°

選擇依賴:

å¨è¿éæå¥å¾çæè¿°
完整的Pom文件:

<?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">
    <modelVersion>4.0.0</modelVersion>

<groupId>com.czxy.demo</groupId>
<artifactId>eureka-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <!-- SpringCloud版本,是最新的F系列 -->
    <spring-cloud.version>Finchley.RC1</spring-cloud.version>
</properties>

<dependencies>
    <!-- Eureka服務端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- SpringCloud依賴,一定要放到dependencyManagement中,起到管理版本的作用即可 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
</project>


編寫啓動類:

@SpringBootApplication
@EnableEurekaServer // 聲明這個應用是一個EurekaServer
public class EurekaDemoApplication {

public static void main(String[] args) {
    SpringApplication.run(EurekaDemoApplication.class, args);
}
}



編寫配置application.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


啓動服務,並訪問:http://127.0.0.1:10086/eureka

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

 

2.將user-service註冊到Eureka


註冊服務,就是在服務上添加Eureka的客戶端依賴,客戶端代碼會自動把服務註冊到EurekaServer中。
我們在user-service-demo中添加Eureka客戶端依賴:

<!-- SpringCloud的依賴 -->

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- Spring的倉庫地址 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>


然後是Eureka客戶端:

<!-- Eureka客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


通過添加@EnableDiscoveryClient來開啓Eureka客戶端功能

SpringBootApplication
@EnableEurekaClient // 開啓EurekaClient功能
public class UserServiceDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserServiceDemoApplication.class, args);
	}
}


編寫配置

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: user-service # 應用名稱
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true # 當調用getHostname獲取實例的hostname時,返回ip而不是host名稱
    ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的話會自己尋找


注意:

  • 這裏我們添加了spring.application.name屬性來指定應用名稱,將來會作爲應用的id使用。
  • 不用指定register-with-eureka和fetch-registry,因爲默認是true

重啓項目,報錯

å¨è¿éæå¥å¾çæè¿°
解決方案,設置如下:

å¨è¿éæå¥å¾çæè¿°

main:
    allow-bean-definition-overriding: true #當遇到同樣名字的時候,是否允許覆蓋註冊


再次運行,OK

å¨è¿éæå¥å¾çæè¿°
我們發現user-service服務已經註冊成功了

3.消費者從Eureka獲取服務
接下來我們修改consumer-demo,嘗試從EurekaServer獲取服務。

方法與消費者類似,只需要在項目中添加EurekaClient依賴,就可以通過服務名稱來獲取信息了!

1)添加依賴:

先添加SpringCloud依賴:

<!-- SpringCloud的依賴 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- Spring的倉庫地址 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>


然後是Eureka客戶端:

<!-- Eureka客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


再啓動類開啓Eureka客戶端

@SpringBootApplication
@EnableDiscoveryClient // 開啓Eureka客戶端
public class UserConsumerDemoApplication {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerDemoApplication.class, args);
    }
}


修改配置:

server:
  port: 8080
spring:
  application:
    name: user-consumer # 應用名稱
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true # 當其它服務獲取地址時提供ip而不是hostname
    ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的話會自己尋找


修改user-consumer-demo項目中的UserDao代碼,用DiscoveryClient類的方法,根據服務名稱,獲取服務實例:

å¨è¿éæå¥å¾çæè¿°
 

// 必須導入org.springframework.cloud.client.discovery.DiscoveryClient
    @Autowired
    private DiscoveryClient discoveryClient;
public User queryUserById(Long id){
    //1、 根據user-service獲取user-serivce 的集羣的信息
    List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
    //2、由於我們沒有集羣,只有一個,所以直接取出第一個
    ServiceInstance instance = instances.get(0);
    //3、拼接URL
    String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;

    // 使用restTemplate發起請求
    ResponseEntity<User> entity = restTemplate.getForEntity(url, User.class);
    // 獲取返回對象
    User user = entity.getBody();
    return user;
}


訪問結果:

å¨è¿éæå¥å¾çæè¿°

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章