SpringCloud Alibaba Nacos
Nacos 基礎(chǔ)
1 官網(wǎng)
1.1 https://github.com/alibaba/Nacos
2 Nacos 是什么?
2.1 一句話: Nacos 就是注冊中心[替代Eureka]+配置中心[替代Config]
2.2 Nacos:Dynamic Naming and Configuration Service
2.3 Nacos:架構(gòu)理論基礎(chǔ): CAP 理論(支持AP 和CP, 可以切換)
3 Nacos 下載&運行
3.1 下載: https://github.com/alibaba/nacos/releases/tag/1.2.1
3.2 環(huán)境要求: Java8/Maven 3.2.x+
3.3 解壓,運行bin/startup.cmd
3.4 瀏覽器http://localhost:8848/nacos
3.5 用戶名/密碼為nacos。
- 輸入: localhost:8848/nacos
創(chuàng)建Nacos 服務(wù)提供者
– 示意圖
創(chuàng)建member-service-nacos-provider-10004 并注冊到NacosServer8848
- 參考member-service-provider-10000 來創(chuàng)建member-service-nacos-provider-10004 即可
- 創(chuàng)建好后, 使用member-service-provider-10000 的源碼和配置替換member-service-nacos-provider-10004 生成的代碼
- 提醒,拷貝時不要忘記拷貝resources/mapper/MemberMapper.xml 這些xxx.xml 文件
修改父項目pom.xml
- 參考官方文檔
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery
修改pom.xml, 加入spring-cloud-alibaba 依賴
<!--引入相關(guān)的依賴-->
<dependencies>
<!--引入nacos-starter nacos的場景啟動器starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!--引入web-starter 說明我們使用版本仲裁(從父項目繼承了版本)
-->
<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>
<!--引入mybatis-starter 整合到springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--引入druid-starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<!--這里需要我們指定版本, 因為父項目沒有-->
<version>1.1.17</version>
</dependency>
<!--引入mysql依賴,使用版本仲裁-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--spring-boot-start-jdbc引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--引入test-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--引入公共模塊-->
<dependency>
<groupId>com.hspedu.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
創(chuàng)建application.yml
將member-service-provider-10000 的application.xml 拷貝過來,修改即可
server:
port: 10004
spring:
application:
name: member-service-nacos-provider #配置應(yīng)用的名稱
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 自己的密碼
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos Server的地址
#配置暴露所有的監(jiān)控點
management:
endpoints:
web:
exposure:
include: '*'
mybatis:
mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
type-aliases-package: com.wyxedu.springcloud.entity # 實例類所在的包,這樣通過類名就可以引用
創(chuàng)建主啟動類
//@EnableDiscoveryClient 引入的是Nacos發(fā)現(xiàn)注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10004 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10004.class, args);
System.out.println();
}
}
為看到更好提示,修改Controller
說明
1. 我們的前端如果是以json格式來發(fā)送添加信息Member, 那么我們需要使用@RequestBody, 才能將數(shù)據(jù)封裝到對應(yīng)的bean, 同時保證http的請求頭的 content-type是對應(yīng)
2. 如果前端是以表單形式提交了,則不需要使用@RequestBody, 才會進行對象參數(shù)封裝, 同時保證http的請求頭的 content-type是對應(yīng)
@RestController
@Slf4j
public class MemberController {
@Resource
private MemberService memberService;
@PostMapping(value = "/member/save")
public Result save(@RequestBody Member member) {//增加
log.info("會員服務(wù)方接收到member= " + member);
int result = memberService.save(member);
log.info("reset= " + result);
if (result > 0) { //成功
return Result.success(" 添加用戶成功 member-service-nacos-provider-10004", result);
} else {
return Result.error("401", "添加用戶失敗");
}
}
//這里使用url占位符+@PathVariable
@GetMapping(value = "/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
Member member = memberService.queryMemberById(id);
log.info("查詢結(jié)果= " + member);
if (member != null) {
return Result.success(" 查詢成功member-service-nacos-provider-10004",
member);
} else {
return Result.error("402", "ID= " + id + " 不存在");
}
}
}
測試
1 啟動Nacos Server 8848
2 啟動member-service-nacos-provider-10004
3 觀察nacos 服務(wù)是否注冊成功
瀏覽器: http://localhost:10004/member/get/1
創(chuàng)建member-service-nacos-provider-10006 并注冊到NacosServer8848
創(chuàng)建member-service-nacos-provider-10006
- 參考member-service-nacos-provider-10004 來創(chuàng)建member-service-nacos-provider-10006 即可
- 創(chuàng)建好后, 使用member-service-nacos-provider-10004 的源碼和配置替換member-service-nacos-provider-10006 生成的代碼
- 提醒,拷貝時不要忘記拷貝resources/mapper/MemberMapper.xml 這些xxx.xml 文件
修改本模塊pom.xml
<dependencies>
<!--引入nacos-starter nacos的場景啟動器starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!--引入web-starter 說明我們使用版本仲裁(從父項目繼承了版本)
-->
<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>
<!--引入mybatis-starter 整合到springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--引入druid-starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<!--這里需要我們指定版本, 因為父項目沒有-->
<version>1.1.17</version>
</dependency>
<!--引入mysql依賴,使用版本仲裁-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--spring-boot-start-jdbc引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--引入test-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--引入公共模塊-->
<dependency>
<groupId>com.hspedu.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
創(chuàng)建application.yml
server:
port: 10006
spring:
application:
name: member-service-nacos-provider #配置應(yīng)用的名稱
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 自己的密碼
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos Server的地址
#配置暴露所有的監(jiān)控點
management:
endpoints:
web:
exposure:
include: '*'
#配置mybatis
mybatis:
mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
type-aliases-package: com.hspedu.springcloud.entity # 實例類所在的包,這樣通過類名就可以引用
創(chuàng)建主啟動類
//@EnableDiscoveryClient 引入的是Nacos發(fā)現(xiàn)注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10006 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10006.class,args);
}
}
為看到更好提示,修改Controller
說明
1. 我們的前端如果是以json格式來發(fā)送添加信息Member, 那么我們需要使用@RequestBody, 才能將數(shù)據(jù)封裝到對應(yīng)的bean, 同時保證http的請求頭的 content-type是對應(yīng)
2. 如果前端是以表單形式提交了,則不需要使用@RequestBody, 才會進行對象參數(shù)封裝, 同時保證http的請求頭的 content-type是對應(yīng)
@RestController
@Slf4j
public class MemberController {
@Resource
private MemberService memberService;
@PostMapping(value = "/member/save")
public Result save(@RequestBody Member member) {//增加
log.info("會員服務(wù)方接收到member= " + member);
int result = memberService.save(member);
log.info("reset= " + result);
if (result > 0) { //成功
return Result.success(" 添加用戶成功 member-service-nacos-provider-10004", result);
} else {
return Result.error("401", "添加用戶失敗");
}
}
//這里使用url占位符+@PathVariable
@GetMapping(value = "/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
Member member = memberService.queryMemberById(id);
log.info("查詢結(jié)果= " + member);
if (member != null) {
return Result.success(" 查詢成功member-service-nacos-provider-10004",
member);
} else {
return Result.error("402", "ID= " + id + " 不存在");
}
}
}
測試
1 啟動Nacos Server 8848
2 啟動member-service-nacos-provider-10006
3 觀察nacos 服務(wù)是否注冊成功
瀏覽器: http://localhost:10006/member/get/1
創(chuàng)建Nacos 的服務(wù)消費者
– 示意圖
創(chuàng)建member-service-nacos-consumer-80 并注冊到NacosServer8848
-
參考member-service-consumer-80 來創(chuàng)建member-service-nacos-consumer-80 即可修改pom.xml
-
將member-service-consumer-80 的pom.xml 的… 拷貝過來,修改即可增加這個包
<!--引入alibaba-nacos 使用版本仲裁-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
創(chuàng)建application.yml
server:
port: 80
spring:
application:
name: member-service-nacos-consumer-80
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos server的地址
創(chuàng)建主啟動類/MemberNacosConsumerApplication80.java
@SpringBootApplication
@EnableDiscoveryClient //引入的是啟動 nacos發(fā)現(xiàn)注解
@EnableFeignClients
public class MemberNacosConsumerApplication80 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosConsumerApplication80.class,args);
}
}
創(chuàng)建配置類config/CustomizationBean.java
/**
* CustomizationBean: 配置類
* 配置注入RestTemplate bean/對象
*/
@Configuration
public class CustomizationBean {
//說明: 配置注入RestTemplate bean/對象
//這里的@LoadBalanced 就是賦予 RestTemplate 負載均衡的能力
//默認是使用輪詢算法來訪問遠程調(diào)用接口/地址
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
創(chuàng)建/MemberNacosConsumerController.java
@RestController
@Slf4j
public class MemberNacosConsumerController {
//說明 http://member-service-nacos-provider 就是服務(wù)注冊到Nacos server的服務(wù)名,注意這里是小寫
public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL =
"http://member-service-nacos-provider"; //老師分析一下這里?應(yīng)該這么填寫
//配置RestTemplate
@Resource
private RestTemplate restTemplate;
//方法1/接口. 添加member
@PostMapping("/member/nacos/consumer/save")
public Result<Member> save(Member member) {
return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL
+ "/member/save", member, Result.class);
}
//方法2/接口, 查詢member
@GetMapping("/member/nacos/consumer/get/{id}")
public Result<Member> getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(
MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/get/" + id, Result.class);
}
}
測試
1 啟動Nacos Server 8848
2 啟動member-service-nacos-provider-10004/10006
3 啟動member-service-nacos-consumer-80
4 瀏覽器: http://localhost/member/nacos/consumer/get/1
配置自己的負載均衡算法, 測試完畢恢復(fù)成原來的輪詢算法
/**
* RibbonRule: 配置類: 配置注入自己的負載均衡算法
*/
@Configuration
public class RibbonRule {
@Bean
public IRule myRibbtonRule() {
//這里返回的是RandomRule, 小伙伴也可以自己指定
return new RandomRule();
}
}
Nacos AP 和CP 切換-理論
各種注冊中心對比
選擇AP 還是CP?
-
CP: 服務(wù)可以不能用,但必須要保證數(shù)據(jù)的一致性。
-
AP: 數(shù)據(jù)可以短暫不一致,但最終是需要一致的,無論如何都要保證服務(wù)的可用。
-
取舍:只能在CP 和AP 選擇一個平衡點, 大多數(shù)都是選擇AP 模式
AP 和CP 切換
說明
? Nacos 集群默認支持的是CAP原則中的AP原則,但是也可切換為CP原則(一般不切換)
? CURL切換命令: curl -X PUT
? ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’
? URL指令:
? $NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP文章來源:http://www.zghlxwxcb.cn/news/detail-465755.html
參考: https://www.jianshu.com/p/c56e22c222bb文章來源地址http://www.zghlxwxcb.cn/news/detail-465755.html
到了這里,關(guān)于SpringCloud Alibaba Nacos的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!