?? 《SpringCloud入門實(shí)戰(zhàn)系列》解鎖SpringCloud主流組件入門應(yīng)用及關(guān)鍵特性。帶你了解SpringCloud主流組件,是如何一戰(zhàn)解決微服務(wù)諸多難題的。項(xiàng)目demo:源碼地址
?? 作者:一只IT攻城獅玉凯。關(guān)注我卿捎,不迷路杭措。
?? 再小的收獲x365天都會成就不一樣的自己垂蜗,一起學(xué)習(xí)喘先,一起進(jìn)步钳吟。
??Nacos簡介、安裝窘拯、運(yùn)行參看上一節(jié): SpringCloud入門實(shí)戰(zhàn)-Nacos簡介红且、安裝坝茎、運(yùn)行詳解
一、項(xiàng)目準(zhǔn)備(Nacos+SpringBoot+OpenFeign)
SpringCloud是分布式微服務(wù)架構(gòu)的一站式解決方案直焙,是多種微服務(wù)架構(gòu)落地技術(shù)的集合體景东。而SpringCloud Alibaba是SpringCloud中一個重要項(xiàng)目,Nacos作為SpringCloud Alibaba項(xiàng)目中的一項(xiàng)重要組件奔誓,我們需要重點(diǎn)去了解和學(xué)習(xí)。
我們知道使用 Nacos 是簡化服務(wù)發(fā)現(xiàn)搔涝、配置管理厨喂、服務(wù)治理及管理的解決方案,讓微服務(wù)的發(fā)現(xiàn)庄呈、管理蜕煌、共享、組合更加容易诬留。Nacos = Eureka + Config + bus可以替代Eureka做服務(wù)注冊中心斜纪,可以替代Config做服務(wù)配置中心。
那我們結(jié)合項(xiàng)目具體來學(xué)習(xí)一下優(yōu)秀的Nacos作為注冊中心是如何使用的文兑。
二盒刚、構(gòu)建Nacos之服務(wù)提供者
可以先準(zhǔn)備好nacos環(huán)境:進(jìn)入的nacos的bin目錄,啟動服務(wù)器 :
sh startup.sh -m standalone
訪問http://localhost:8848/nacos看到界面即成功啟動绿贞。接下來搭建項(xiàng)目因块。
1、pom中引入依賴
新建父工程cloud-nacos籍铁。
1)父pom中引入spring-cloud-alibaba-dependencies
依賴涡上,注意SpringBoot、SpringCloud拒名、Spring Cloud Alibaba及組件間版本問題吩愧。可參看SpringBoot增显、SpringCloud雁佳、Spring Cloud Alibaba版本對照表(詳細(xì)準(zhǔn)確)。我的版本如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
提示:搭建好項(xiàng)目甸怕,如果后續(xù)啟動測試時(shí)也會報(bào)錯:
Could not initialize class com.alibaba.nacos.common.remote.client.grpc.GrpcSdkClient
那也是因?yàn)橐玫膕pring cloud 版本甘穿,alibaba cloud版本,nacos的版本不一致導(dǎo)致的梢杭。
2)新建子module温兼,cloud-payment工程作為服務(wù)提供者,pom引入spring-cloud-starter-alibaba-nacos-discovery
依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
提示:由于Netflix Ribbon 進(jìn)入停更維護(hù)階段武契,因此SpringCloud 2020.0.1 版本之后募判,刪除了eureka中的ribbon, 替代ribbon的是spring cloud自帶的LoadBalancer荡含,默認(rèn)使用的是輪詢的方式,新版本的 Nacos discovery 都已經(jīng)移除了 Ribbon ,因此我們
使用Nacos時(shí)也需要引入loadbalancer
才能調(diào)起服務(wù)届垫。
2释液、yml文件增加配置
cloud:
nacos:
discovery:
# 配置 nacos 的服務(wù)地址
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
3、啟動類
啟動類增加注解:@EnableDiscoveryClient
4装处、測試
編寫簡單的查詢業(yè)務(wù)類误债,并啟動服務(wù),可以看到nacos上實(shí)例數(shù)變成2
三妄迁、構(gòu)建Nacos之服務(wù)消費(fèi)者
1寝蹈、pom中引入依賴
新建module:cloud-order。這里我引入了spring-cloud-starter-openfeign
通過openfeign代替Ribbon+RestTemplate
方式調(diào)用服務(wù)提供者登淘。
提示:openfeign知識傳送門:SpringCloud入門實(shí)戰(zhàn)-OpenFeign服務(wù)調(diào)用
附上完整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-nacos</artifactId>
<groupId>org.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-order</artifactId>
<dependencies>
<dependency>
<groupId>org.test</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--使用Spring Cloud LoadBalancer 進(jìn)行客戶端負(fù)載均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<!-- devtools熱部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2箫老、yml文件配置
server:
port: 80
spring:
application:
name: cloud-order #微服務(wù)應(yīng)用的名字
cloud:
nacos:
discovery:
server-addr: localhost:8848
## 消費(fèi)者將要去訪問的微服務(wù)名稱( 注冊成功進(jìn) nacos 的微服務(wù)提供者)
service-url:
nacos-user-service: http://cloud-payment
3、啟動類
啟動類增加注解:@EnableDiscoveryClient
以及開啟feign的調(diào)用@EnableFeignClients
/**
* @author qy
* @date 2022年07月13日 16:46
*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
public class CloudOrder {
public static void main(String[] args) {
SpringApplication.run(CloudOrder.class, args);
}
}
4黔州、測試
編寫簡單的查詢業(yè)務(wù)類耍鬓,并啟動服務(wù),可以看到nacos上實(shí)例數(shù)變成3
重點(diǎn)代碼:
/**
*
* OrderController.java
*/
@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
@Resource
private PaymentService paymentService;
@GetMapping(value = "/ok/{id}")
public String paymentInfoOk(@PathVariable("id") Integer id) {
String result = paymentService.paymentInfoOk(id);
log.info("========result:{}========", result);
return result;
}
@GetMapping(value = "/timeout/{id}")
public String paymentInfoTimeOut(@PathVariable("id") Integer id) {
String result = paymentService.paymentInfoTimeOut(id);
log.info("========result:{}========", result);
return result;
}
}
/**
*
* Feign接口類 PaymentService.java
*/
@Component
@FeignClient(value = "cloud-payment",fallback = PaymentFallbackService.class)
public interface PaymentService {
@GetMapping(value = "/payment/ok/{id}")
String paymentInfoOk(@PathVariable("id") Integer id);
@GetMapping(value = "/payment/timeout/{id}")
String paymentInfoTimeOut(@PathVariable("id") Integer id);
}
@Component
public class PaymentFallbackService implements PaymentService {
@Override
public String paymentInfoOk(Integer id) {
return "全局解耦降級處理PaymentFallback->paymentInfoOk流妻!";
}
@Override
public String paymentInfoTimeOut(Integer id) {
return "全局解耦降級處理PaymentFallback->paymentInfoTimeOut牲蜀!";
}
}
訪問http://localhost/order/ok/1測試,多次調(diào)用合冀,輪詢訪問各薇。
如果你的應(yīng)用測試報(bào)錯:
Load balancer does not contain an instance for the service ..
參看:解決辦法。
Nacos作為服務(wù)注冊與發(fā)現(xiàn)的項(xiàng)目實(shí)戰(zhàn)就到這里了君躺。下一節(jié)峭判,我們再詳細(xì)介紹Nacos服務(wù)配置中心、Nacos集群和持久化配置棕叫。