1. 程式人生 > 實用技巧 >springCloud - Eureka

springCloud - Eureka

1.SpringCloud簡介

SpringCloud集成了很多元件,包括:

  • Eureka: 服務治理,服務註冊/發現
  • Zuul: 閘道器元件,提供智慧路由,訪問過濾功能 (集成了ribbon、hystrix)
  • Ribbon:客戶端負載均衡的服務呼叫元件(客戶端負載)
  • Fegin: 服務之間的呼叫元件 (集成了ribbon、hystrix)
  • Hystrix: 容錯管理元件

2.Eureka註冊中心

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

2.1.搭建註冊中心EurekaServer

匯入依賴:

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.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>
        <spring-cloud.version>Finchley.RC2</spring-cloud.version>
    </properties>
  <!--註冊中心的依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

    </dependencies>
<!-- SpringCloud的依賴 統一管理版本號-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

編寫application.yml配置檔案

server:
  port: 8081 # 埠
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    service-url: # EurekaServer的地址,現在是自己的地址,如果是叢集,需要加上其它Server的地址。
      defaultZone: http://127.0.0.1:${server.port}/eureka

在引導類上加註解:

@SpringBootApplication
@EnableEurekaServer // 聲明當前springboot應用是一個eureka服務中心

public class ItcastEurekaApplication {

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

直接啟動,訪問http:localhost:8081即可訪問到

2.2.將其他服務註冊到Eureka中

service-provide

  1. 在pom.xml中,新增springcloud的相關依賴。
  2. 在application.yml中,新增springcloud的相關配置。
  3. 在引導類上添加註解,把服務注入到eureka註冊中心。

參照service-eureka的pom.xml中加入Eureka的客戶端,載匯入其他與資料庫相關的依賴等

 <!-- Eureka客戶端 -->

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.yml:

erver:
  port: 8082
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/li
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver
  application:
    name: service-provider # 應用名稱,註冊到eureka後的服務名稱
mybatis:
  type-aliases-package: com.li.service.pojo
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:8081/eureka

在引導類上加上註解

@SpringBootApplication
@EnableDiscoveryClient
public class ItcastServiceProviderApplication {

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

啟動後在註冊中心中就可以看到此服務,可以再寫一個服務的消費方的服務,也註冊到Eureka中,通過feign來遠端呼叫;

service-customer

1.加入Feign依賴

  <!--引入Feign元件依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.引導類加上註解

@SpringBootApplication
@EnableDiscoveryClient //啟動客戶端
@EnableFeignClients  //啟用Feign元件代替RestTemplate遠端呼叫 :其中包含熔斷和負載均衡
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class,args);
    }
}

3.建立介面

/**
 * fallback = UserClientFallback.class : 熔斷
 */
@FeignClient(value = "service-provide") //宣告介面為feign客戶端介面,並指明呼叫的微服務名(id)
public interface UserClient {
    @GetMapping("user/{id}")
    public User queryUserById(@PathVariable("id") Integer id);
}

4.建立controller

@Controller
@RequestMapping("consumer/user")
public class UserController {
    @Autowired
    private UserClient userClient;
    @GetMapping
    @ResponseBody
    public String queryUserById(@RequestParam("id") Integer id) {
        return this.userClient.queryUserById(id).toString();
    }
}

3.服務提供方

服務續約

在註冊服務完成以後,服務提供者會維持一個心跳(定時向EurekaServer發起Rest請求),告訴EurekaServer:“我還活著”。這個我們稱為服務的續約(renew);

eureka:
  instance:
    lease-expiration-duration-in-seconds: 10 # 10秒即過期
    lease-renewal-interval-in-seconds: 5 # 5秒一次心跳
  • lease-expiration-duration-in-seconds: 服務續約(renew)的間隔,預設為30秒
  • lease-expiration-duration-in-seconds:服務失效時間,預設值90秒

預設情況下每個30秒服務會向註冊中心傳送一次心跳,證明自己還活著。如果超過90秒沒有傳送心跳,則會在服務列表裡移除

4.服務消費方

eureka:
  client:
    service-url:
    registry-fetch-interval-seconds: 5  #拉取服務的間隔時間

5.失效剔除和自我保護

失效剔除

有時服務掛掉過著關掉,Eureka Server會將這些服務從列表中剔除:

自我保護

在當某些服務掛掉之後,Eureka會將這寫服務保護一段時間,不被直接剔除

eureka:
  server:
    enable-self-preservation: false # 關閉自我保護模式(預設為開啟)
    eviction-interval-timer-in-ms: 1000 # 掃描失效服務的間隔時間(預設為60*1000ms)