springcloud-alibaba之nacos超级详解

简介: springcloud-alibaba之nacos超级详解

一,springcloud alibaba简介

再介绍一门技术之前,我们一定要先去读他的官网,把它看个两遍三遍的

官网:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。


依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。


二,nacos讲解

在将结nacos之前,依旧需要先读官网:https://nacos.io/zh-cn/

接下来讲我们的重点了,在学了之前的springclod之后,我们的注册中心和配置中心是使用eureka + config + bus,重点来了,nacos直接将这三个给取代了,而且不需要像之前一样需要重启项目才能进行访问.每次学完旧技术再学新技术,就感觉自己又被坑了。只不过虽然新技术简单,但是思想还是一样的,都是互相 “抄作业” 的。


接下来用一张图来说明nacos的作用,来自官网


20210218214021942.png


三,nacos下载安装以及解决期间遇到的坑

这里使用windows下的作为演示,当然nacos作为集群的部署最终还是需要到linux下进行部署的。

下载官网:https://github.com/alibaba/nacos/releases/tag/1.1.4

20210218214755579.png


解压完成之后,出现以下画面即可

20210218214846437.png

接下来打开conf文件下面的application.properties文件,最好使用notepad++打开,真的是神器。

20210218214956982.png

作如下修改,否则在启动时报错。将前面的 # 号去掉,全部打开处于正常运行状态

20210218215319824.png

再将nccos-mysql.sql脚本丢入到mysql数据库中,并且数据库名称为nacos

20210218215457796.png

再将bin目录下的startup.cmd脚本打开

20210218215910582.png

将26行的改成和下面的一样,都为standalone

20210218220012166.png

接下来打来bin目录,点击startup.cmd运行即可,出现如下画面,则nacos安装成功!

20210218220347202.png

由上图可知,端口号默认为8848,接下来打开浏览器访问一下,输入http://localhost:8848/nacos 即可,账号密码都是nacos,由于我做了集群配置因此出现了以下界面,刚开始肯定是一个登录页面的,我这里回不去了,账号密码一定都是nacos


20210218221627616.png

四,编码以及集群的搭建

首先约定>配置>环境,环境的配置,可以参考我前面的一篇springcloud微服务入门:https://blog.csdn.net/zhenghuishengq/article/details/113790619


1,通用包api-commons

20210218222341363.png

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>cloud2020</artifactId>
        <groupId>com.atgui.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-api-commons</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <!--热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
</project>

实体类CommonResult

package com.zheng.api.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResult<T> {
    private Integer code;   //类似404
    private String message; //信息描述
    private T data;         //
    public CommonResult(Integer code,String message){
        this(code,message,null);
    }
}

实体类Payment

package com.zheng.api.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Payment implements Serializable {
    private long id;
    private String serial;
    @Override
    public String toString() {
        return "Payment{" +
                "id=" + id +
                ", serial='" + serial + '\'' +
                '}';
    }
}
2,服务提供者,搭建一个集群,分别为cloudalibaba-provider-payment-9001和cloudalibaba-provider-payment-9002

拿cloudalibaba-provider-payment-9001为例,另一个改一个端口号即可。

<?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>cloud2020</artifactId>
        <groupId>com.atgui.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloudalibaba-provider-payment-9001</artifactId>
    <dependencies>
        <!--  SpringCloud alibaba nacos    -->
        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <!--引入自己定义的 api 通用包-->
            <groupId>com.atgui.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--  web组件      -->
        <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>
    </dependencies>
</project>

application.yml

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置nacos地址
management:
  endpoints:
    web:
      exposure:
        include: "*"

PaymentController

package com.zheng.springcloud.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 zhenghuisheng
 * @date 2021/02/16
 */
@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;
    }
}

主启动类PaynentMain9001.java

package com.zheng.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class PaynentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaynentMain9001.class,args);
    }
}

cloudalibaba-provider-payment-9002在application.yml中改个端口号就行了

server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置nacos地址
management:
  endpoints:
    web:
      exposure:
        include: "*"
3,消费者

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>cloud2020</artifactId>
        <groupId>com.atgui.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>
    <dependencies>
        <!--   nacos config     -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--  SpringCloud alibaba nacos    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--    引入自定义的api通用包,可以使用Payment支付Entity    -->
        <dependency>
            <!--引入自己定义的 api 通用包-->
            <groupId>com.atgui.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--  web组件      -->
        <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>
    </dependencies>
</project>

bootstrap.yml

没错,就是bootstrap.yml,他与application.yml具有父子级关系,先加载bootstrap.yml再加载application.yml

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos 服务注册中心地址
      config:
        server-addr: localhost:8848 # Nacos 作为配置中心地址
        file-extension: yaml  #指定yaml格式的配置 yml会报错,nacos识别yaml

application.yml

spring:
  profiles:
    active: dev
    #    active: test
#    active: info

ConfigController

package com.zheng.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope   //通过SpringCloud原生注解 @RefreshScope 实现配置自动更新
public class ConfigController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

主启动类 ConfigMain3377.java

package com.zheng.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigMain3377.class,args);
    }
}
五,测试

依旧使用的是Run Dashboard,可以参考springcloud入门的博客,里面有具体的配置

再次打开nacos,在浏览器上输入localhost:8848/nacos,可以发现以下界面。

几个服务名正是我们application.yml里面的服务名

也可以再详情这个按钮中看到

六,总结

根据以上步骤,nacos就已经搭建出来了

如需代码,可以访问:https://gitee.com/zhenghuisheng/springcloud

相关文章
|
2月前
|
SpringCloudAlibaba 负载均衡 Java
【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
264 1
【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
|
1月前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
|
2月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
236 0
|
2月前
|
SpringCloudAlibaba Dubbo 前端开发
【三】SpringCloud Alibaba之Nacos整合篇(作为配置中心)
【三】SpringCloud Alibaba之Nacos整合篇(作为配置中心)
248 0
|
2月前
|
SpringCloudAlibaba 负载均衡 Java
【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
314 0
|
2月前
|
存储 Cloud Native Java
深入比较Spring Cloud Nacos和Eureka的区别
【2月更文挑战第12天】
99 0
|
3月前
|
Java Nacos 开发者
解决Spring Cloud整合Nacos与Gateway的探险之旅
解决Spring Cloud整合Nacos与Gateway的探险之旅
75 0
|
3月前
|
Java Nacos Docker
Spring Cloud Alibaba【什么是Nacos、Nacos Server下载安装 、Docker安装Nacos Server服务、微服务聚合父工程构建】(一)
Spring Cloud Alibaba【什么是Nacos、Nacos Server下载安装 、Docker安装Nacos Server服务、微服务聚合父工程构建】(一)
86 0
|
4月前
|
Java 应用服务中间件 Nacos
springcloud2-注册中心eureka及nacos
springcloud2-注册中心eureka及nacos
36 0
|
5月前
|
应用服务中间件 Nacos 数据库
SpringCloud微服务之Nacos集群搭建
SpringCloud微服务之Nacos集群搭建
90 0