Spring Cloud 是最前非常火的微服務框架,好多公司都會或多或少的用到它,幾乎每一個 Java 開發崗位的招聘資訊上都要求掌握 Spring Cloud 或者 Dubbo 微服務框架,所以說,Spring Cloud 應該是一個 Java 開發者必須掌握的。
如果你對 Spring Cloud 體系還不是很瞭解,可以先讀一下 如果你也打算學習 Spring Cloud
本篇介紹 Eureak 實現簡單的註冊中心。
下一篇會介紹 Eureka 實現高可用註冊中心和安全控制。
Eureka 是什麼
Eureka 是 Netflix 開源的服務註冊發現元件,服務發現可以說是微服務架構的核心功能了,微服務部署之後,一定要有服務註冊和發現的能力,Eureka 就是擔任這個角色的。如果你用過 dubbo 的話,那一定知道 dubbo 中服務註冊和發現的功能是用 zookeeper 來實現的。
Eureka 目前是 2.x 版本,並且官方已經宣佈不再維護更新。不過其實 Eureka 已經很穩定了,當做註冊中心完全沒有問題。Spring Cloud 整合了 Eureka ,並做了完善的封裝。方便我們使用 Spring boot 開發的時候簡單配置就可以使用。
概要介紹
微服務框架中有三類角色,分別是註冊中心、服務提供者、服務消費者,註冊中心就是今天要說的主角 Eureka,這篇文章簡單說明 Spring Cloud Eureka 的使用,模擬實現單點和高可用註冊中心,並簡單介紹服務提供者和服務消費者如何使用 Eureka 提供的服務註冊和發現功能。
版本說明
Java : 1.8
Spring Boot : 2.1.3.RELEASE
Spring Cloud: Finchley.SR2
之說以要說一下版本,因為 Finchley.SR2 版本較之前的版本包名有變化,所以在引用 maven 包的時候要注意。
實現單點註冊中心
建立 Eureka 註冊中心
1、引用 maven 包,其中
<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>
<!-- 最新版的 eureka 服務端包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- 監控管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
複製程式碼
2、新建 bootstrap.yml,並配置 Spring cloud 引數
spring:
application:
name: kite-eureka-center
cloud:
inetutils: ## 網路卡設定
ignoredInterfaces: ## 忽略的網路卡
- docker0
- veth.*
- VM.*
preferredNetworks: ## 優先的網段
- 192.168
複製程式碼
3、新建 application.yml ,並配置引數
server:
port: 3000
eureka:
instance:
hostname: eureka-center
appname: 註冊中心
client:
registerWithEureka: false # 單點的時候設定為 false 禁止註冊自身
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:3000/eureka
server:
enableSelfPreservation: false
evictionIntervalTimerInMs: 4000
複製程式碼
bootstrap.yml 和 application.yml 的區別:
- bootstrap.yml 在 application.yml 之前啟動;
- bootstrap.yml 配置 application 的 name、spring.cloud.config.server.git.uri、一些encryption/decryption(加密/解密)資訊;
- application.yml 的資訊會覆蓋 bootstrap.yml 中的內容,當遇到相同的配置的時候;
4、新建 Application.java 啟動檔案
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
複製程式碼
@EnableEurekaServer 表示使用 Eureka Server 端功能,也就是啟動為一個註冊中心節點。
5、執行 Application.java ,訪問 http://localhost:3000 即可看到 Eureka 提供的 ui 控制檯。
建立一個服務提供者
接下來建立一個服務提供者,並註冊到上面建立的 Eureka 註冊中心。
1、新增 maven 依賴包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka 客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
複製程式碼
2、配置 application.yml
server:
port: 3001
eureka:
instance:
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka ## 註冊到 eureka
spring:
application:
name: single-provider ## 應用程式名稱,後面會在消費者中用到
複製程式碼
3、建立一個簡單的 RESTful 介面 controller
@Slf4j
@RestController
public class ProviderController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping(value = "/hello")
public String hello(){
List<String> services = discoveryClient.getServices();
for(String s : services){
log.info(s);
}
return "hello spring cloud!";
}
@RequestMapping(value = "/nice")
public String nice(){
List<String> services = discoveryClient.getServices();
for(String s : services){
log.info("gogogo" + s);
}
return "nice to meet you!";
}
}
複製程式碼
4、建立 spring boot 啟動類
@EnableEurekaClient
@SpringBootApplication
public class SingleProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SingleProviderApplication.class, args);
}
}
複製程式碼
@EnableEurekaClient 修飾,表示要註冊到註冊中心。
5、啟動專案,正常情況下就註冊到了 Eureka 註冊中心,開啟 Eureka 控制檯,會看到已經出現了這個服務
建立一個服務消費者
有了服務提供者,接下來建立一個消費者來消費一下
1、引用 maven 包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
複製程式碼
2、配置 application.yml
server:
port: 3002
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:3000/eureka ## 註冊到 eureka
instance:
preferIpAddress: true
spring:
application:
name: single-customer
複製程式碼
3、開始消費提供者提供的服務介面,這裡演示了兩種消費方法,一種是用 RestTemplate ,另外一種是用 FeignClient,Feign 同樣是 Netflix 開源,並被 Spring Cloud 封裝到 spring-cloud-starter-openfeign 包中。
建立啟動類,並新增相關注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SingleCustomerApplication {
/**
* 注入 RestTemplate
* 並用 @LoadBalanced 註解,用負載均衡策略請求服務提供者
* 這是 Spring Ribbon 的提供的能力
* @return
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SingleCustomerApplication.class, args);
}
}
複製程式碼
@EnableEurekaClient 宣告此專案為一個 eureka 客戶端,@EnableFeignClients 宣告此專案可以使用 Feign。
4、建立一個服務介面類,這是 Feign 的使用方式,詳細的用法可以查一下 Spring Cloud Feign 相關文件
/**
* IHelloService
* 配置服務提供者:single-provider 是服務提供者的 application.name
*/
@FeignClient("single-provider")
public interface IHelloService {
@RequestMapping(value = "/hello")
String hello();
@RequestMapping(value = "nice")
String nice();
}
複製程式碼
@FeignClient 註解的 value 為服務提供者的 appplication.name 。
5、建立一個 Controller 用於呼叫服務
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private IHelloService helloService;
private static final String applicationName = "single-provider";
@RequestMapping(value = "feignRequest")
public Object feignRequest(){
String s = helloService.nice();
return s;
}
@RequestMapping(value = "commonRequest")
public Object commonRequest(){
String url = "http://"+ applicationName +"/hello";
String s = restTemplate.getForObject(url,String.class);
return s;
}
}
複製程式碼
其中 feignRequest 方法是使用了 Feign 的方式呼叫服務介面;
commonRequest 方法是用 RestTemplate 提供的方法呼叫服務介面;
6、最後,啟動服務,訪問地址:http://localhost:3002/commonRequest 和 http://localhost:3002/feignRequest
各位同學趕快關注、點贊吧,這年頭,拿幾個贊太難了! 後續系列文章正在路上瘋狂朝你奔來呦!