SpringBoot集成Eureka
首先第一點,查看Eureka官方,看下springBoot與Eureeka版本問題。防止版本不兼容問題
- Finchley 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x
- Dalston和Edgware 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x
- Camden 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x
- Brixton 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x
- Angel 兼容Spring Boot 1.2.x
道人最開始選擇的版本爲SpringBoot 2.3.1版本,springCloud 選 Hoxton.SR5版本,但是該版本選擇,在道人本地創建父項目進行版本管理時,子項目依賴導入失敗,故最後降低版本,解決了該問題。問題的原因暫時沒找到,歡迎道友指點!
具體代碼參見道人的開源項目:https://github.com/bigskyfish/springCloudLearn
項目大致結構
一:父項目
目的:使用標籤進行版本管理,避免版本衝突。
父項目-cloudlearn
- 父項目的打包形式必須是pom:pom
- :標籤進行模塊管理
- :標籤進行版本管理,避免版本衝突
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.floatcloud</groupId>
<artifactId>cloudlearn</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloudlearn</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<modules>
<module>eureka-server8001</module>
<module>order-server9001</module>
<module>order-server9002</module>
<module>consumer-client7001</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.5.RELEASE</spring-boot.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
二:Eureka服務註冊
pom.xml
- 打包形式爲jar:jar
- 中依賴不指定版本會直接應用父項目中的jar包版本
- 導入的是spring-cloud-starter-netflix-eureka-server的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.floatcloud</groupId>
<artifactId>cloudlearn</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.floatcloud</groupId>
<artifactId>eureka-server8001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server8001</name>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
pom.xml
server:
port: 8001
eureka:
instance:
# 服務註冊中心IP地址
hostname: localhost
client:
# 是否向服務註冊中心註冊自己
register-with-eureka: false
# 是否檢索服務
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
springboot入口(啓動類)
- 需加上@EnableEurekaServer註解
package com.floatcloud.eurekaserver8001;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer8001Application {
public static void main(String[] args) {
SpringApplication.run(EurekaServer8001Application.class, args);
}
}
三:服務提供者(Provider)
這裏展示的order-server9001模塊代碼,order-server9002與order-server9001模塊代碼相同。
pom.xml
- 打包形式爲jar:jar
- 中依賴不指定版本會直接應用父項目中的jar包版本
- 導入的是spring-cloud-starter-netflix-eureka-client的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloudlearn</artifactId>
<groupId>com.floatcloud</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.floatcloud</groupId>
<artifactId>order-server9001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>order-server9001</name>
<packaging>jar</packaging>
<dependencies>
<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.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
- 多個服務組成的集羣的項目名稱需要保持一致。
#啓動端口
server:
port: 9001
#項目名稱
spring:
application:
name: order-provider
#eureka配置
eureka:
instance:
prefer-ip-address: true #使用服務的id地址註冊
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8001/eureka/
fetch-registry: true
register-with-eureka: true
springboot入口(啓動類)
- 需加上@EnableEurekaServer註解
package com.floatcloud.orderclient9001;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* OrderClient9001Application
*
* @auther FloatCloud
* @date 2020/6/23
*/
@SpringBootApplication
@EnableEurekaClient
public class OrderClient9001Application {
public static void main(String[] args){
SpringApplication.run(OrderClient9001Application.class, args);
}
}
調用接口(Controller)
- @RestController : 返回數據爲對象而非頁面,相當於@ResponseBody + @Controller
- 這裏標記了下端口號,負載均衡時,更加直觀。
package com.floatcloud.orderclient9001.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* OrderController
*
* @auther FloatCloud
* @date 2020/6/23
*/
@RestController
public class OrderController {
@Value("${server.port}")
private String port;
@GetMapping("/order-server/create/order")
public String createOrder(){
return "端口:"+port+"產生訂單";
}
}
四:服務消費者(Consumer)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloudlearn</artifactId>
<groupId>com.floatcloud</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.floatcloud</groupId>
<artifactId>consumer-client7001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer-client7001</name>
<packaging>jar</packaging>
<dependencies>
<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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
#啓動端口
server:
port: 7001
#項目名稱
spring:
application:
name: order-consumer
#eureka配置
eureka:
instance:
prefer-ip-address: true #使用服務的id地址註冊
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8001/eureka/
springboot入口(啓動類)
- 需加上@EnableEurekaServer註解
配置類
- RestTemplate納入javaBean管理
package com.floatcloud.consumerclient.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* SysConfiguration
* 遠程調用採用的是RestTemplate方式調用
* @LoadBalanced 該註解做負載均衡,詳細會在道人博客中介紹
* @auther FloatCloud
* @date 2020/6/23
*/
@Configuration
public class SysConfiguration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
遠程調用(基於RestTemplate)
- 調用的url爲服務提供者在Eureka服務註冊中心,註冊的application值。
package com.floatcloud.consumerclient.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* ConsumerController
*
* @auther FloatCloud
* @date 2020/6/23
*/
@RestController
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
/**
* 服務提供的地址:即服務提供方的spring.application.name 轉大寫
* 也可以理解爲在Eureka服務註冊中心,註冊的application值。
*/
final String urlPath = "http://ORDER-PROVIDER";
@GetMapping("/consumer/make/order")
public String makeOrder(@RequestParam("name") String name){
String template = restTemplate.getForObject(urlPath + "/order-server/create/order", String.class);
return name + template;
}
}