IDEA搭建spring cloud一步一步詳解
1 概述
Spring Cloud基於Spring Boot,提供了多個組件來幫助企業進行微服務系統建設;它提供的主要功能有:服務注冊中心/服務注冊/服務調用/負載均衡/斷路器等;一般情況下它都是使用已有的開源軟件,在其基礎上按Spring Boot的理念來進行封裝,簡化各種個組件的調用以及各個組件之間的交互。2 常用組件
Spring Cloud主要包含以下常用組件:2.1 Eureka
分成兩類,一是注冊中心及EurekaServer,用於提供服務注冊/服務申請等功能;一是被注冊者及服務提供者EurekaClient,用於向EurekaServer注冊服務並可從EurekaServer獲取需要調用的服務地址信息;
需要向外提供服務的應用,需要使用EurekaClient來向Server注冊服務。
2.2 Ribbon
負責進行客戶端負載均衡的組件;一般與RestTemplate結合,在訪問EurekaClient提供的服務時進行負載均衡處理。也就是說,Ribbon用於服務調用者向被調用者進行服務調用,並且如果服務者有多個節點時,會進行客戶端的負載均衡處理;
2.3 Feign
與Ribbon功能類型,用於調用方與被調用方的服務調用,同時進行客戶端負載均衡的處理;不過它能提供類似本地調用的方式調用遠程的EurekaClient提供的服務;它實際上是在Ribbon基礎上進行了進一步的封裝來提高調用服務的簡便性。3 使用示例
3.1 示例場景
假設現在有SERVICEAPP1向外提供服務,該服務同時部署兩個節點;Client通過Feign或者是Ribbon調用其提供的服務,其部署關系及數據流向圖如下所
第一步:啟動注冊中心;服務提供者及調用者向服務中心注冊;
第二步:服務調用者向服務中心申請服務,根據服務中心返回的地址信息調用服務提供者提供的服務;
第三步:注冊中心通過心跳檢測方式檢測服務提供者的狀態,當某個提供者連接不上時,發送消息通知所有注冊者;
一.項目目錄結構
先上一張構建好的spring-cloud工程結構圖.(聯網操作!!!聯網操作!!聯網操作!!!重要的事情說三遍)
二.創建root項目
spring-cloud_root是root項目,里面包括Eureka服務(eureka-server)和Eureka客戶端(eureka-client)
1.File → New project,這里選擇 maven項目,然后下一步填寫Groupid和Artifactld,然后下一步,
2.配置root項目的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sky</groupId>
<artifactId>spring-cloud-01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<modules>
<module>eureka-server</module>
<module>service-client-01</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
</build>
</project>
這里注意:這是因為我們還未建eureka-server子模塊
三.創建eureka-server子model
1.在spring-cloud_root項目右鍵 new → module,選擇Spring initializr然后next:
聯網導入相關的依賴
當我們建第一個模塊eureka-server的時候,root項目的pom文件就不會報錯了!(簡而言之我們還缺少一個service-clien)這樣的模塊!
eureka-server 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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dupo</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</spring-cloud.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>
<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>
</build>
</project>
在啟動類上加@EnableEurekaServer//注解
配置application.yml文件,此文件一定要以application.yml命名,且一定要放到resources目錄下(pringboot約定大於約束原則)
application.yml內容如下!
server:
port: 9001
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
這里我的9001已經被占用了!我用的是9002(瀏覽器訪問:http://localhost:9002/)
此時, Instances currently registered with Eureka 下顯示是空的,目前還沒有服務注冊到這里,下面開始寫客戶端項目.
四.創建eureka-client項目.
一樣的操作!!
這樣我們的root項目下的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dupo</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
</properties>
<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-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>
</build>
</project>
編寫一個controller,代碼如下:
如果不能引用@RestController@RequestMapping注解
導入依賴
更新pom文件
啟動eureka-server后啟動qureka-client 重新訪問http://localhost:9002/ 這時候nstances currently registered with Eureka下回注冊一個實例
訪問我們編寫的controller來驗證eureka服務是否搭建成功,瀏覽器輸入地址:http://localhost:9002/client/hi?name=sky,瀏覽器返回結果如下,這spring cloud到此搭建完成.!!
如果能看到 hi sky , i am from port 9002 ,恭喜你搭建成功,