1.Nacos簡(jiǎn)介
1.2.為什么叫Nacos讶请?
前四個(gè)字母分別為Naming和Configuration的前兩個(gè)字母,最后的s為Service
1.3.是什么?
- 一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)屎媳,配置管理和服務(wù)管理中心
- Nacos:Dynamic Naming and Configuration Service
- Nacos就是注冊(cè)中心+配置中心的組合(等價(jià)于:Nacos = Eureka+Config+Bus)
1.4.能干嘛夺溢?
- 替代Eureka做服務(wù)注冊(cè)中心
- 替代Config做服務(wù)配置中心
1.5.去哪下?
1.6.各種注冊(cè)中心比較
2.安裝并運(yùn)行Nacos
- 本地Java8+Maven環(huán)境已經(jīng)OK
- 先從官網(wǎng)下載Nacos
- 解壓安裝包,直接運(yùn)行bin目錄下的startup.cmd
- 命令運(yùn)行成功后直接訪問(wèn)http: //localhost:8848/nacos(默認(rèn)賬號(hào)密碼都是nacos)
- 運(yùn)行結(jié)果頁(yè)面如下
3.Nacos作為服務(wù)注冊(cè)中心演示
3.1.搭建工程
3.1.1.父工程spingcloud20
(1)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>
<groupId>com.xiaoliu</groupId>
<artifactId>spingcloud20</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!--統(tǒng)一管理jar包和版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.10</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.verison>1.1.16</druid.verison>
<mybatis.plus.boot.verison>3.2.0</mybatis.plus.boot.verison>
</properties>
<!--子模塊繼承之后烛谊,提供作用:鎖定版本+子model不用寫groupId和version-->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.0-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.2.1.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.verison}</version>
</dependency>
<!-- mybatis-plus-springboot整合 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.boot.verison}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.1.2.公共子模塊cloud-api-commons
(1)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">
<parent>
<artifactId>spingcloud20</artifactId>
<groupId>com.xiaoliu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-api-commons</artifactId>
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
(2)統(tǒng)一返回結(jié)果R.java
package com.xiaoliu.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
* 統(tǒng)一返回結(jié)果類
* @Author LL
* @Date 2020-04-07 10:27
*/
@Data
public class R{
private Boolean success;//是否成功
private Integer code;//返回碼
private String message;//返回信息
private Map<String,Object> data = new HashMap<>();//返回?cái)?shù)據(jù)
/**
* 構(gòu)造方法私有化
*/
private R(){}
/**
* 成功的靜態(tài)方法
* @return R
*/
public static R ok(){
R r = new R();
r.setSuccess(true);
r.setCode(200);
r.setMessage("成功");
return r;
}
/**
* 失敗的靜態(tài)方法
* @return R
*/
public static R error(){
R r = new R();
r.setSuccess(false);
r.setCode(999);
r.setMessage("失敗");
return r;
}
public R success(Boolean success){
this.setSuccess(success);
return this;
}
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(Map<String, Object> map){
this.setData(map);
return this;
}
public R data(String key,Object value){
this.data.put(key,value);
return this;
}
}
(3)公共實(shí)體類Payment.java
package com.xiaoliu.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
*
* @Author LL
* @Date 2020-04-07 10:22
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Payment implements Serializable {
private Long id;
private String serial;
}
3.2.基于Nacos的服務(wù)提供者 cloudalibaba-provider-payment9001
(1)pom.xml文件
<dependencies>
<!-- nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
(2)application.yml文件
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 192.168.10.33:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
(3)PaymentMain9001.java
package com.xiaoliu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author LL
* @Date 2020-07-07 13:22
*/
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
(4)PaymentController.java
package com.xiaoliu.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author LL
* @Date 2020-07-07 13:23
*/
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id="+id;
}
}
3.3.基于Nacos的服務(wù)提供者 cloudalibaba-provider-payment9002
仿cloudalibaba-provider-payment9001創(chuàng)建风响,其中端口號(hào)為9002
3.4.基于Nacos的服務(wù)消費(fèi)者 cloudalibaba-consumer-nacos-order83
(1)pom.xml
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.xiaoliu</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</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.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(2)application.yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.10.33:8848
(3)OrderNacosMain83.java
package com.xiaoliu;
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.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @Author LL
* @Date 2020-07-07 14:11
*/
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
@Bean
@LoadBalanced//負(fù)載均衡
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
(4)OrderNacosController.java
package com.xiaoliu.controller;
import com.xiaoliu.service.PaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Author LL
* @Date 2020-07-07 14:27
*/
@RestController
public class OrderNacosController {
@Autowired
private RestTemplate restTemplate;
//ribbon負(fù)載均衡使用
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id)
{
String url = "http://nacos-payment-provider/payment/nacos/"+id;
return "使用ribbon:"+restTemplate.getForObject(url, String.class);
}
}
說(shuō)明:Nacos中自帶負(fù)載均衡Ribbon,為什么Nacos支持負(fù)載均衡丹禀?
3.5.測(cè)試
啟動(dòng)項(xiàng)目状勤,nacos控制臺(tái)顯示如下
http:// localhost:83/consumer/payment/nacos/13 ,83訪問(wèn)9001/9002双泪,輪詢負(fù)載OK