目錄
零、系列
歡迎來嫖從零開始SpringCloud Alibaba電商系列:
- 從零開始SpringCloud Alibaba電商系統(一)——Alibaba與Nacos服務註冊與發現
- 從零開始SpringCloud Alibaba電商系統(二)——Nacos配置中心
- 從零開始SpringCloud Alibaba電商系統(三)——Sentinel流量防衛兵介紹、流量控制demo
- 從零開始SpringCloud Alibaba電商系統(四)——Sentinel的fallback和blockHandler
- 從零開始SpringCloud Alibaba電商系統(五)——Feign Demo,Sentinel+Feign實現多節點間熔斷/服務降級
- 從零開始SpringCloud Alibaba電商系統(六)——Sentinel規則持久化到Nacos配置中心
一、SpringCloud Alibaba
什麼是SpringCloud Alibaba?
簡言之,SpringCloud Alibaba是對SpringCloud全生態的一個封裝簡化,其中還引入了一些阿里自研或其他的開源組件。
Alibaba讓我們更好的使用電商。
二、Nacos是什麼
Nacos官網原文:
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。
用過springCloud的朋友知道,Nacos對標Erueka。
沒用過的朋友可以這樣理解,Nacos是一個路由表,我們的各個微服務Web之間相互尋找需要通過這個路由表。
比如業務A有兩個節點A1和A2,業務B有個節點B1想要調用A的某個接口。我們不需要在業務B中寫一堆A的url來調用api,只要告訴Nacos我們要找業務A,它就
會告訴我們業務A有哪些節點。
三、簡述CAP
我們可能經常聽說Zookeeper是CP的,Erueka是AP的,Nacos支持AP和CP之類的觀點,那麼CAP究竟是什麼呢?
CAP原則又稱CAP定理,指的是在一個分佈式系統中,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)。 ————百度百科
對於一個分佈式系統來說,P(分區容錯性)是必然,但是C(一致性)和可用性(A)之間卻存在衝突,只可取其一,舉個例子:
註冊中心註冊了N、M兩個系統節點,某天M系節點統通信不穩定了(心跳包有問題),
那麼對於要求C(一致性)來說,M系統節點將被禁止提供服務,即便這會造成其他節點壓力增大。
而對於A(可用性)來說,M系統需要工作,即使返回結果可能不準確也要提供生產力。
四、如何使用Nacos服務端
nacos服務端支持很多種部署方式,詳情見:https://nacos.io/zh-cn/docs/quick-start.html
筆者比較喜歡docker-compose,使用docker部署步驟如下:
1. 拉取nacos 源碼。
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
2. nacos-docker自帶的examples/standalone-mysql-5.7.yaml文件默認會啓動一個自帶的mysql並連接。
如果要使用自己的mysql,我們就需要修改yaml文件及一個mysql配置文件,並且自己將nacos所需的數據庫導入到我們使用的mysql中(這一點實在是太不友好了,希望未來會得到改進)。
這裏不想再開啓一個mysql容器的同學可以和筆者一樣,選擇derby方式啓動(需要先安裝docker及docker-compose)。
docker-compose -f example/standalone-derby.yaml up -d
3. 頁面訪問 --> http://ip:8848/nacos/
五、項目端集成Nacos-服務提供方
1. nacos-provider
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.1.0.RELEASE</version>
</parent>
<groupId>com.lele</groupId>
<artifactId>mall</artifactId>
<version>1.0-SNAPSHOT</version>
<name>mall</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- spring cloud alibaba,必須有,版本自選 -->
<dependencyManagement>
<dependencies>
<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>
<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>
<!-- alibaba 必須有,版本自選-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- junit -->
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. application.properties文件如下:
server.port=8081
spring.application.name=order
spring.cloud.nacos.discovery.server-addr=之前的nacos服務端ip:8848
management.endpoints.web.exposure.include=*
3. application如下:
@SpringBootApplication
@EnableDiscoveryClient //必須有,
public class MallApplication {
public static void main(String[] args) {
SpringApplication.run(MallApplication.class, args);
}
}
4、正常啓動後,我們會看到服務列表多出了我們的application。
六、項目端繼承Nacos-消費者方
在上面我們啓用了order模塊,order模塊提供了一些對外的api接口供其他服務調用,我們可以創建一個user項目來調用這個api(通過Nacos來調用)。
1. 首先,我們現在order模塊補上一個服務方法。
@RestController
public class Hello {
@GetMapping(value = "/hello/{string}")
public String hello(@PathVariable String string) {
return "Hello! 我是Order,感謝你(" + string+")來調用我的hello方法";
}
}
2. 然後,新建一個product,pom與application.properties與上面一樣不再贅述,這個項目我們給起名user。
3. 最後,我們在product中加入訪問order模塊API接口的方法。
@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/hi")
public String hi(){
ServiceInstance serviceInstance = loadBalancerClient.choose("order"); // 負載均衡獲取我們實際要訪問的項目地址
String path = String.format("http://%s:%s/hello/%s",serviceInstance.getServiceId(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
return restTemplate.getForObject(path,String.class);
}
}
}
4. 訪問product的接口,可以看到成功返回了orderAPI的信息,服務路由成功。
http://localhost:8082/hi
七、Demo代碼
Nacos服務註冊Demo代碼地址:https://github.com/flyChineseBoy/lel-mall/tree/master/mall01
mall目錄爲訂單模塊,product目錄爲庫存模塊。