1. 程式人生 > 其它 >Eureka註冊中心

Eureka註冊中心

1.1 RestTemplate 的配置

首先改造 RestTemplate 的配置,新增一個 @LoadBalanced 註解,這個註解會自動構造 LoadBalancerClient 介面的實現類並註冊到 Spring 容器中,程式碼如下所示。

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

接下來就是改造呼叫程式碼,我們不再直接寫固定地址,而是寫成服務的名稱,這個名稱就是我們註冊到 Eureka 中的名稱,是屬性檔案中的 spring.application.name,相關程式碼如下所示。

@RestController
public class ArticleController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/article/callHello2")
    public String callHello2() {

    return restTemplate.getForObject("http://eureka-client-user-service/user/hello", String.class);
}
}

1.2 Eureka註冊中心開啟密碼認證

Eureka 自帶了一個 Web 的管理頁面,方便我們查詢註冊到上面的例項資訊,但是有一個問題:如果在實際使用中,註冊中心地址有公網 IP 的話,必然能直接訪問到,這樣是不安全的。所以我們需要對 Eureka 進行改造,加上許可權認證來保證安全性。
在Eureka服務中,通過整合 Spring-Security 來進行安全認證。
在 pom.xml 中新增 Spring-Security 的依賴包,程式碼如下所示。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然後在application.yml中加上認證的配置資訊:

spring:
  security:
    #設定安全認證
    user:
      name: sa
      password: 123123

增加 Security 配置類:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 關閉csrf
        http.csrf().disable();
        // 支援httpBasic
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

在 Eureka 開啟認證後,客戶端註冊的配置也要加上認證的使用者名稱和密碼資訊:

eureka.client.serviceUrl.defaultZone=http://zhangsan:123456@localhost:8761/eureka/

1.3 Eureka叢集搭建

搭建步驟:
1.eureka-server-cluster,配置跟 eureka-server 一樣。
2.pom.xml檔案引入:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3.applicationl.yml檔案配置:

server:
  port: 9000
spring:
  application:
    name: eureka-server-cluster
  security:
    user:
      name: admin
      password: admin
      ## 指定不同的環境
  #profiles: master
eureka:
  instance:
    hostname: localhost
  client:
      # 由於該應用為註冊中心, 所以設定為false, 代表不向註冊中心註冊自己
    register-with-eureka: false
     # 由於註冊中心的職責就是維護服務例項, 它並不需要去檢索服務, 所以也設定為 false
    fetch-registry: false
    service-url:
      defaultZone: http://admin:admin@localhost:8080/eureka/
  1. eureka-server application.yml的配置檔案
server:
  port: 8080
spring:
  application:
    name: eureka-server
  security:
    #設定安全認證
    user:
      name: admin
      password: admin
eureka:
  instance:
    hostname: localhost
  client:
    # 由於註冊中心的職責就是維護服務例項, 它並不需要去檢索服務, 所以也設定為 false
    fetch-registry: false
    # 由於該應用為註冊中心, 所以設定為false, 代表不向註冊中心註冊自己
    register-with-eureka: false
    service-url:
      defaultZone: http://admin:admin@localhost:9000/eureka/

之前在客戶端中我們通過配置 eureka.client.serviceUrl.defaultZone 來指定對應的註冊中心,當我們的註冊中心有多個節點後,就需要修改 eureka.client.serviceUrl.defaultZone 的配置為多個節點的地址,多個地址用英文逗號隔開即可:

eureka:
  instance:
    hostname: localhost
    # 定義例項ID格式
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}
  client:
    service-url:
      defaultZone: http://admin:admin@localhost:8080/eureka/,http://admin:admin@localhost:9000/eureka/
    instance:
      prefer-ip-address: true #使用IP地址註冊