教程首頁鏈接:SpringCloudAlibaba實戰教程系列
-----------------------------目錄------------------------------------
1、構建父maven項目,引入pom依賴,對應第一步。
2、構建服務提供者,對應第二步。
3、構建服務消費者,對應第三步。
-----------------------------目錄------------------------------------
第一步:在父pom的項目中引入dependencyManagement。
在引入父pom之前咱們先來回顧下dependencyManagement與使用他的原因
什么是dependencyManagement:他可以統一管理項目的版本號,確保應用的各個子項目的依賴和版本一致,當需要變更版本號的時候只需要在父類容器里更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個特殊的版本號時,只需要在自己的模塊dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承於父類版本號。
為什么用dependencyManagement:首先在springCloudAlibaba的項目中對於版本的依賴要求很嚴格,所有需要統一來聲明管理每隔依賴的版本號。版本之間的關系參考SpringCloudAlibaba實戰教程系列
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
在引入上面的版本聲明之后在父pom中引入下面幾個將要使用的依賴
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </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>
完整的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.niu.cloud</groupId> <artifactId>cloud-alibaba</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>nacos-provider</module> <module>nacos-consumer</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--spring 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> <scope>test</scope> </dependency> </dependencies> <repositories> <!--指定阿里雲鏡像庫下載依賴--> <repository> <id>central</id> <name>aliyunmaven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories> </project>
第二步:構建服務提供者進行服務注冊
1、在父項目中創建子module項目名字為nacos-provider,在pom中引入nacos服務注冊依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
完整服務提供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>cloud-alibaba</artifactId> <groupId>com.niu.cloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>nacos-provider</artifactId> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、application.yml或者properties文件
server:
port: 8080
spring:
#服務應用名字
application:
name: nacos-provider
#配置注冊ip:端口,注意即使是80端口也不可能省略
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3、配置啟動服務的啟動類。為簡單化我這里http調用接口也開發出來了
package com.niu.cloud; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author niunafei * @function * @email niunafei0315@163.com * @date 2020/5/1 12:46 PM * @EnableDiscoveryClient 開啟服務注冊 */ @EnableDiscoveryClient @SpringBootApplication @RestController @Slf4j public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } /** * @return */ @GetMapping("/provider") public String provider() { log.info("服務提供者正常服務"); return "服務提供者正常服務"; } }
4、在服務啟動的時候看到如下日志證明注冊成功
5、查看http://localhost:8848/nacos,查看服務的注冊情況
第三步:構建服務消費者進行服務調用
1、在父項目中創建子module項目名字為nacos-comsumer,在pom中引入nacos服務注冊依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
完整服務提供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>cloud-alibaba</artifactId> <groupId>com.niu.cloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>nacos-comsumer</artifactId> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、application.yml或者properties文件
server:
port: 8081
spring:
#服務應用名字
application:
name: nacos-consumer
#配置注冊ip:端口,注意即使是80端口也不可能省略
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3、服務消費有兩種實現方式:
方式1(推薦):簡單理解是在創建RestTemplate對象的時候添加 @LoadBalanced注解,該注解為底層為ribben來實現的負載均衡,詳情代碼如下:
package com.niu.cloud;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2020/5/1 3:51 PM
*/
@Slf4j
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
/**
* 創建服務調用的對象
*
* @return
* @LoadBalanced 添加此注解后,RestTemplate就具有了ribben客戶端負載均衡能力
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer")
public String consumer() {
log.info("---------消費者開始------------");
//調用服務
String result = restTemplate.getForObject("http://nacos-provider/provider", String.class);
log.info("---------消費者結束--------result{}----", result);
return result;
}
}
}
方式2:是springcloudalibaba的官網案列形式,依賴LoadBalancedClient來實現。

package com.niu.cloud; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @author niunafei * @function * @email niunafei0315@163.com * @date 2020/5/1 3:51 PM */ @Slf4j @SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } /** * 創建服務調用的對象 * * @return */ @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @RestController public class ConsumerController { @Autowired private LoadBalancerClient client; @Autowired private RestTemplate restTemplate; @GetMapping("/consumer") public String consumer() { log.info("---------消費者開始------------"); //獲取服務對象,注意nacos-provider是服務提供者應用名稱 ServiceInstance instance = client.choose("nacos-provider"); //調用服務 String result = restTemplate.getForObject(instance.getUri() + "/provider", String.class); log.info("---------消費者結束--------result{}----", result); return result; } } }
4、啟動consumer服務,瀏覽器訪問消費者http://localhost:8081/consumer接口,可以看到下面服務者正常提供服務。
5、看下方式一消費者調用日志如下圖: 首先是正常的注冊成功,看接下來的就是ribben實現負載均衡功能的調用日志(大概的流程是,通過完整的url進行拆分,根據服務名獲取注冊的服務列表,然后負載到某個服務,拼接ip與端口完善url,進行http調用,返回結果)。
教程首頁鏈接:SpringCloudAlibaba實戰教程系列
為何一個@LoadBalanced注解就能讓RestTemplate擁有負載均衡的能力?【享學Spring Cloud】