Eureka註冊中心
阿新 • • 發佈:2021-06-16
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/
- 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地址註冊