首先參考以下幾個文檔順序完成相應的搭建,注意,除了eureka作爲服務server引入jar其它全部作爲client引入服務註冊和發現的依賴,而對於config依賴只有配置中心的服務作爲server,其它應用服務作爲client
- 項目搭建參考文檔:https://www.jianshu.com/p/65dfbb55779b
- 項目啓動參考文檔:https://blog.csdn.net/singlekingdom/article/details/91378831
- 服務註冊發現保證服務之間不用頻繁修改地址:https://www.cnblogs.com/luchangyou/p/7576552.html
- 配置中心:https://blog.51cto.com/12965378/2403913
- rabbitMQ安裝(配置的實時刷新):https://www.cnblogs.com/sam-uncle/p/9050242.html 到計算管理中心啓動rabbitmq服務 到\rabbitmq_server-3.7.9\sbin 下執行命令啓動管理頁面 rabbitmq-plugins enable rabbitmq_management
執行完以上步驟後的工程結構如下:
configserver提供配置的配置中心並能夠通過rabbitmq廣播給各個服務刷新配置
eureka提供給各服務的服務註冊和發現,便於服務之間調用不用知道ip端口,只需要知道服務名稱即可
springcloudapi在此僅僅是提供服務之間交互的模型對象
springcloudconsumeruser8000服務調用方
springcloudprovideruser8001服務被調用方
以上描述的均是springcloud的子工程
1、父工程依賴如下
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cn.springcloud</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloudapi</module>
<module>springcloudprovideruser8001</module>
<module>springcloudconsumeruser8000</module>
<module>Eureka</module>
<module>configserver</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.version>1.0-SNAPSHOT</project.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<lombok.version>1.16.18</lombok.version>
<log4j.version>1.2.17</log4j.version>
<junit.version>4.12</junit.version>
<mysql.version>6.0.6</mysql.version>
<druid.version>1.1.10</druid.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql jdbc 驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.8.2</version>
<executions>
<execution>
<id>default-site</id>
<phase>site</phase>
<goals>
<goal>site</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--被依賴的公共模塊必須加上這個,打包之後啓動,選擇後面帶EXE的啓動,依賴該模塊的其他模塊就不會因爲找不到依賴而打包出錯-->
<classifier>exe</classifier>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、Eureka工程結構
Eureka依賴
<?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>springcloud</artifactId>
<groupId>com.cn.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Eureka</artifactId>
<dependencies>
<!-- 引入API -->
<dependency>
<groupId>com.cn.springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日誌 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- web模塊 -->
<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>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>
</project>
application.yml文件配置如下
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka
eureka啓動類
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main( String[] args ) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3、configserver配置管理服務
依賴
<?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>springcloud</artifactId>
<groupId>com.cn.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-server</artifactId>
<dependencies>
<!-- 引入API -->
<dependency>
<groupId>com.cn.springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日誌 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- web模塊 -->
<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>
</dependency>
<!--將微服務註冊到Eureka Service-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--消息服務總線,動態更新配置信息-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</project>
啓動類
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
dev提供給其它服務用的配置 config-server-dev.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
instance:
appname: 111網關服務1112修改了哦11166666ask
prefer-ip-address: true
lease-renewal-interval-in-seconds: 2
lease-expiration-duration-in-seconds: 5
application.yml文件
server:
port: 8888
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:pass@localhost:8761/eureka
spring:
application:
name: config-server
cloud:
config:
server:
native:
# 必須寫絕對路徑,否則可能導致bus總線無法及時通過 /actuator/bus-refresh post請求及時刷新配置並通知所有的服務 (Content-Type application/json;charset=utf-8 此值必須設置)
search-locations: E:/svn/springcloud/configserver/src/main/resources/config
bus:
enabled: true
trace:
enabled: true
profiles:
active: native
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: bus-refresh
配置完之後啓動服務即可
如果想要刷新配置,直接修改config-server-dev.yml文件然後調用配置中心接口/actuator/bus-refresh即可刷新所有服務的本地配置(所有服務在啓動的時候會優先從遠處獲取配置然後保存到本地,後續都用本地的配置,所以需要rabbitmq通知每個服務刷新本地配置),調用方式如下(我採用的是idea自帶的restful遠程調用根據類似於postman):
當刷新配置的時候其它服務會打印出如下日誌,表明服務總線配置ok的
4、spring cloud api
依賴
<?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>springcloud</artifactId>
<groupId>com.cn.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
</project>
5、spring cloud調用方
依賴
<?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>springcloud</artifactId>
<groupId>com.cn.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-user-8000</artifactId>
<dependencies>
<!-- 引入API -->
<dependency>
<groupId>com.cn.springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日誌 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- web模塊 -->
<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>
</dependency>
<!--將微服務註冊到Eureka Service-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
</project>
@Configuration
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController
@RefreshScope
public class UserController_Consumer {
/**
* 服務提供方地址
*/
private static final String url = "http://springcloud-provider/";
/**
* 從配置中心獲取配置
*/
@Value("${eureka.client.instance.appname}")
private String config_instance_name;
/**
* RestTemplate 提供了多種便捷訪問遠程HTTP服務的方法
* 是一種簡單便捷的訪問restful服務模版類,是Spring提供的用於訪問
* Rest服務的客戶端模版工具集
*/
@Resource
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/user/all")
@ResponseBody
public List getUserAll() {
return restTemplate.getForObject(url.concat("user/all"), List.class);
}
@RequestMapping(value = "/consumer/user/{id}")
@ResponseBody
public ResponseEntity<User> getUserById(@PathVariable("id") Long id) {
return restTemplate.getForEntity(url.concat("user/").concat(id.toString()), User.class);
}
@RequestMapping(value = "/consumer/getConfig")
@ResponseBody
public String getConfig( ) {
return config_instance_name ;
}
}
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient
public class Application_consumer_8000 {
public static void main(String[] args) {
SpringApplication.run(Application_consumer_8000.class, args);
}
@Bean
@LoadBalanced//在註冊中心裏進行查找微服務,負載均衡
public RestTemplate restTemplate(){
RestTemplate restTemplate=new RestTemplate();
return restTemplate;
}
}
application.yml文件
server:
port: 8200
# 下面這個參數是爲解決問題而新增的
tomcat:
max-http-header-size: 81920
eureka:
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://user:pass@localhost:8761/eureka
spring:
application:
name: springcloud-customer
cloud:
config:
name: config-server
profile: dev
uri: http://localhost:8888
discovery:
enabled: true
service-id: config-server
fail-fast: true
bus:
trace:
enabled: true
management:
endpoints:
web:
exposure:
include: refresh
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
5、springcloud被調用方
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.cn.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-user-8001</artifactId>
<dependencies>
<!-- 引入API -->
<dependency>
<groupId>com.cn.springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 數據源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- 數據庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 日誌 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- springBoot 集成 mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- web模塊 -->
<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>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!--<scope>runtime</scope>-->
</dependency>
<!--將微服務註冊到Eureka Service-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</project>
@RestController
@RequestMapping
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/user/all")
@ResponseBody
public List<User> getAllUser(){
return userService.findAll();
}
@RequestMapping(value = "/user/{id}")
@ResponseBody
public User getUserById(@PathVariable("id") Long id){
return userService.findById(id);
}
}
@Mapper
public interface UserDao {
@Select("select id,user_name as userName,db_source as dbSource,phone,email,pwd from t_user")
/**
*
*/
List<User> findAll();
@Select("select id,user_name as userName,db_source as dbSource,phone,email,pwd from t_user where id = #{id}")
/**
*
*/
User findById(Long id);
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findById(Long id) {
return userDao.findById(id);
}
public List<User> findAll() {
return userDao.findAll();
}
}
@EnableEurekaClient
@SpringBootApplication
@MapperScan(basePackages = "com.cn.springcloud")
public class Application_provider_8001 extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application_provider_8001.class, args);
}
}
application.yml文件(在此用的postgresql數據庫,所以此服務需要引入此依賴)
xserver:
port: 8181
mybatis:
type-aliases-package: com.cn.springcloudapi.entites #所以entity別名類所在路徑
spring:
application:
name: springcloud-provider
datasource:
url: jdbc:postgresql://localhost:5433/postgres #數據庫連接
username: postgres
password: ***
driver-class-name: org.postgresql.Driver
dbcp2:
min-idle: 5 #數據庫連接池的最小維持連接數
initial-size: 5 #初始化連接數
max-total: 5 #最大連接數
max-wait-millis: 200 #等待連接獲取的最大超時時間
eureka:
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://user:pass@localhost:8761/eureka
6、rabbitmq安裝,參考以上文檔即可