1. 程式人生 > >SpringCloud(一)之Eureka

SpringCloud(一)之Eureka

SpringCloud(一)之Eureka

1.eureka是什麼?

eureka 其實就是一個javaweb程式,通過map來存放節點資訊,然後顯示的時候通過map取出資料進行展示。進而達到它成為一個註冊中心的目的。

2.eureka和zookeeper的區別

首先明白一個理論CAP定理,C(Consistency)一致性、A(Availability)可用性,P(Partition tolerance)分割槽容錯性,在一個分散式系統中,三者不可兼得。

zookeeper

zookeeper其實就是一個分散式協調服務,它設計的初衷就是做 一個分散式協調服務,為了資料的一致性而存在的。(天然的分散式鎖)。保證了資料的高度一致性。

zk和eureka的區別

zk更加支援的是一致性(c),和分割槽容錯性(p),而eureka更加支援的是可用性(a)和分割槽容錯性§。

zk的可用性並沒有eureka那麼高,其實上一個分散式系統我們更加需要的是註冊中心的高可用,只要註冊中心活著一切都好說,zk由於他的重啟選舉的時間較長,所以可用性並沒有eureka的好。所以就拿一個註冊中心來講,eureka的效能是要比zk好的。

3.springboot整合eureka

1.首先建立一個聚合工程,用來管理依賴。

pom檔案如下:

 <parent>
        <groupId>
org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.18.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>
org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> </dependencies>
2.建立註冊中心

pom依賴:

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

        <!--

          和安全相關的配置,新增後 eureka 就會需要密碼訪問
          -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
       

yml配置:

server:
  port: 8900

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
security:
  user:
    name: admin
    password: admin


程式碼:

@SpringBootApplication
@EnableEurekaServer
public class EurekaAppliaction {
    public static void main(String[] args) {
        SpringApplication.run(EurekaAppliaction.class);
    }
}

需要注意的是這裡是一個eureka的註冊中心所以需要加EnableEurekaServer註解。

然後啟動專案就可以看到一個註冊中心的管理介面如下:

WeChatf75ce71c4bbc216fc04036676ccfee99

可以看到在eureka中註冊的服務資訊。

3.建立服務提供者

yml配置:

server:
  port: 8901

spring:
  application:
    name: provider-eureka

eureka:
  client:
    serviceUrl:
      defaultZone: http://admin:[email protected]:8900/eureka

程式碼:

@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class);
    }
}

因為是一個客戶端所以註解為EnableEurekaClient。啟動專案就可以在註冊中心中看到自己的註冊資訊了,可以在上圖中檢視。

4.建立服務消費者

yml的配置資訊和提供者的基本一致,這裡就不再累述了。

消費者程式碼:

package com.zy.eureka.consume;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class EurekaConsumeApplication {

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


    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }

}


RestTemplate這個物件是spring針對於介面呼叫的一個類,可以去呼叫服務提供者的連結。

@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private EurekaClient eurekaClient;

    @GetMapping("/hello")
    public String hello() {
        InstanceInfo info = eurekaClient.getNextServerFromEureka("PROVIDER-EUREKA", false);

        String url = info.getHomePageUrl();
        String result = restTemplate.getForObject(url+"hello/eureka", String.class);
        return result;
    }


}

EurekaClient是eureka的一個客戶端物件,可以通過這個物件獲取註冊在eureka上的提供者的資訊,再過通過

RestTemplate進行呼叫即可。

當然這樣呼叫如果服務消費者者呼叫服務提供者的時候還是單一的呼叫一個主機,沒有達到負載均衡的作用,接下來的部落格中會介紹springcloud之ribbon來實現消費者呼叫提供者的負載均衡。

SpringCloud(二)之feign和ribbon