簡單的springcloud搭建
注冊中心:eureka
接口服務:server
web服務:web
網關:zuul
配置中心:config
pom參數統一管理:common
1、創建一個空的maven項目為springcloud
2、修改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"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaostudy</groupId> <artifactId>springcloudTest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> </modules> <build> <plugins> <!--參考文章:https://blog.csdn.net/liupeifeng3514/article/details/80236077--> <plugin> <!-- 指定maven編譯的jdk版本,如果不指定,maven3默認用jdk 1.5 maven2默認用jdk1.3 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <!-- 源代碼使用的JDK版本 --> <source>1.8</source> <!-- 需要生成的目標class文件的編譯版本 --> <target>1.8</target> <!-- 字符集編碼 --> <encoding>UTF-8</encoding> <!-- 跳過測試 --> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
3、創建注冊中心Eureka
3.1、配置注冊中心eureka的配置文件application.yml
1 server: 2 port: 9900 3 4 eureka: 5 instance: 6 hostname: localhost 7 client: 8 # 聲明是否將自己的信息注冊到 Eureka 服務器上 9 registerWithEureka: false 10 # 是否到 Eureka 服務器中抓取注冊信息 11 fetchRegistry: false 12 serviceUrl: 13 defaultZone: http://@eureka.user.name@:@eureka.user.password@@${eureka.instance.hostname}:${server.port}/eureka/ 14 15 16 spring: 17 application: 18 name: eurka-service 19 security: 20 user: 21 name: @eureka.user.name@ 22 password: @eureka.user.password@

<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xiaostudy</groupId> <artifactId>eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <eureka.user.name>admin</eureka.user.name> <eureka.user.password>xiaostudy.test</eureka.user.password> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!--為eureka配置賬號密碼--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <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> <dependencyManagement> <dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <!--指定resources插件處理哪個目錄下的資源文件--> <directory>src/main/resources</directory> <!--打開資源過濾功能--> <filtering>true</filtering> </resource> </resources> </build> </project>
3.2、添加@EnableEurekaServer注解
3.3、啟動注冊中心
注:如果啟動報讀取不了yml文件,可能是編碼問題。把編碼設置成utf-8就可以了。
3.4、訪問
注:如果啟動后登陸不了,可以試試添加配置類(必須,不然其他服務發現不了注冊中心)
1 package com.xiaostudy.eureka.config; 2 3 import org.springframework.security.config.annotation.web.builders.HttpSecurity; 4 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 5 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 6 7 @EnableWebSecurity 8 public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 9 10 @Override 11 protected void configure(HttpSecurity http) throws Exception { 12 //關閉csrf 13 http.csrf().disable(); 14 super.configure(http); 15 } 16 }
4、創建一個server模塊,模擬發布接口
4.1、添加注解@EnableDiscoveryClient和@EnableFeignClients
server的yml文件
1 server: 2 port: 9901 3 4 eureka: 5 instance: 6 preferIpAddress: true 7 instance-id: ${spring.cloud.client.ip-address}:${server.port} 8 client: 9 serviceUrl: 10 defaultZone: http://@eureka.user.name@:@eureka.user.password@@localhost:9900/eureka/ 11 12 spring: 13 application: 14 name: server-service 15 cloud: 16 loadbalancer: 17 retry: 18 enabled: false

<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xiaostudy</groupId> <artifactId>server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <eureka.user.name>admin</eureka.user.name> <eureka.user.password>xiaostudy.test</eureka.user.password> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</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-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <!--指定resources插件處理哪個目錄下的資源文件--> <directory>src/main/resources</directory> <!--打開資源過濾功能--> <filtering>true</filtering> </resource> </resources> </build> </project>
4.2、創建services及實現類、controller和接口
services接口
package com.xiaostudy.server.services; public interface TestServices { public String get(String name); }
services實現類
package com.xiaostudy.server.services.impl; import com.xiaostudy.server.services.TestServices; import org.springframework.stereotype.Service; @Service public class TestServicesImpl implements TestServices { @Override public String get(String name) { return "參數name:" + name; } }
controller
package com.xiaostudy.server.controller; import com.xiaostudy.server.services.TestServices; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class TestController { @Autowired private TestServices testServices; @RequestMapping("/get") public String get(String name) { return testServices.get(name); } }
接口
package com.xiaostudy.server.apis; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient(name = "server-service", contextId = "TestServicesApis") public interface TestServicesApis { @RequestMapping("/test/get") public String get(String name); }
4.3、啟動server
5、添加一個web模塊,通過接口調用服務

<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xiaostudy</groupId> <artifactId>web</artifactId> <version>0.0.1-SNAPSHOT</version> <name>web</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <eureka.user.name>admin</eureka.user.name> <eureka.user.password>xiaostudy.test</eureka.user.password> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>com.xiaostudy</groupId> <artifactId>server</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <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> <dependencyManagement> <dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <!--指定resources插件處理哪個目錄下的資源文件--> <directory>src/main/resources</directory> <!--打開資源過濾功能--> <filtering>true</filtering> </resource> </resources> </build> </project>
web的配置文件application.yml
server: port: 9902 eureka: instance: preferIpAddress: true instance-id: ${spring.cloud.client.ip-address}:${server.port} client: serviceUrl: defaultZone: http://@eureka.user.name@:@eureka.user.password@@localhost:9900/eureka/ spring: application: name: web-service cloud: loadbalancer: retry: enabled: false
web的controller
package com.xiaostudy.web.controller; import com.xiaostudy.server.apis.TestServicesApis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class TestWebController { @Autowired private TestServicesApis testServicesApis; @RequestMapping("/getTest") public String getTest() { return testServicesApis.get("通過web調用的"); } }
啟動web
6、添加網關zuul

<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xiaostudy</groupId> <artifactId>zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <name>zuul</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <eureka.user.name>admin</eureka.user.name> <eureka.user.password>xiaostudy.test</eureka.user.password> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <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> <dependencyManagement> <dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <!--指定resources插件處理哪個目錄下的資源文件--> <directory>src/main/resources</directory> <!--打開資源過濾功能--> <filtering>true</filtering> </resource> </resources> </build> </project>

server:
port: 9903
eureka:
instance:
preferIpAddress: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
serviceUrl:
defaultZone: http://@eureka.user.name@:@eureka.user.password@@localhost:9900/eureka/
spring:
application:
name: zuul-service
cloud:
loadbalancer:
retry:
enabled: false
zuul:
routes:
server:
path: /server/**
serviceId: server-service
sensitiveHeaders: "*"
web:
path: /web/**
serviceId: web-service
sensitiveHeaders: "*"
添加注解@EnableDiscoveryClient和@EnableZuulProxy
啟動zuul
7、添加配置中心
config的application.yml
server:
port: 9904
eureka:
instance:
preferIpAddress: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
serviceUrl:
defaultZone: http://@eureka.user.name@:@eureka.user.password@@localhost:9900/eureka/
spring:
application:
name: config-service
cloud:
loadbalancer:
retry:
enabled: false
profiles:
active: native
添加注解@EnableDiscoveryClient和@EnableConfigServer
或者
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>

server:
port: 9902
eureka:
instance:
preferIpAddress: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
serviceUrl:
defaultZone: http://@eureka.user.name@:@eureka.user.password@@localhost:9900/eureka/
spring:
application:
name: web-service
cloud:
loadbalancer:
retry:
enabled: false
config:
discovery:
# 開啟配置中心服務發現支持
enabled: true
# 配置中心服務的id
service-id: config-service
# 那個文件夾,config模塊resources/config下的那個文件夾
label: dev
# 讀取后綴名稱
profile: dev
# 配置文件名稱
name: config
# fail-fast 如果訪問配置中心失敗,則停止啟動服務
fail-fast: true
# retry 訪問配置中心失敗時的重試策略
retry:
initial-interval: 2000
# 最多重試次數
max-attempts: 6
# 最大重試間隔
max-interval: 4000
# 每次重試時間是之前的倍數
multiplier: 1.2
啟動順序,注冊中心(eureka)、配置中心(config)、server、web、zuul(后面三個沒有順序)
8、添加一個common模塊,用於各個模塊的父模塊,統一管理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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xiaostudy</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <name>common</name> <packaging>pom</packaging> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <eureka.user.name>admin</eureka.user.name> <eureka.user.password>xiaostudy.test</eureka.user.password> <springCloudTest.version>0.0.1-SNAPSHOT</springCloudTest.version> </properties> <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> <dependencyManagement> <dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <!--指定resources插件處理哪個目錄下的資源文件--> <directory>src/main/resources</directory> <!--打開資源過濾功能--> <filtering>true</filtering> </resource> </resources> </build> </project>
配置中心config也可以修改成
<?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.xiaostudy</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../common/pom.xml</relativePath> </parent> <groupId>com.xiaostudy</groupId> <artifactId>config</artifactId> <version>${springCloudTest.version}</version> <name>config</name> <description>Demo project for Spring Boot</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> </project>
server也可以修改成
<?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.xiaostudy</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../common/pom.xml</relativePath> </parent> <groupId>com.xiaostudy</groupId> <artifactId>server</artifactId> <version>${springCloudTest.version}</version> <name>server</name> <description>Demo project for Spring Boot</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</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-web</artifactId> </dependency> </dependencies> </project>
網關zuul也可以修改成
<?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.xiaostudy</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../common/pom.xml</relativePath> </parent> <groupId>com.xiaostudy</groupId> <artifactId>zuul</artifactId> <version>${springCloudTest.version}</version> <name>zuul</name> <description>Demo project for Spring Boot</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies> </project>
web也可以修改成
<?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.xiaostudy</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../common/pom.xml</relativePath> </parent> <groupId>com.xiaostudy</groupId> <artifactId>web</artifactId> <version>${springCloudTest.version}</version> <name>web</name> <description>Demo project for Spring Boot</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-dependencies</artifactId> <version>2.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency> <dependency> <groupId>com.xiaostudy</groupId> <artifactId>server</artifactId> <version>${springCloudTest.version}</version> </dependency> </dependencies> </project>
后續在此基礎上完善
把feign從server從抽取出來