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的作用,来自官网

在这里插入图片描述

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

这里使用windows下的作为演示,当然nacos作为集群的部署最终还是需要到linux下进行部署的。
下载官网:https://github.com/alibaba/nacos/releases/tag/1.1.4
在这里插入图片描述

解压完成之后,出现以下画面即可
在这里插入图片描述
接下来打开conf文件下面的application.properties文件,最好使用notepad++打开,真的是神器。
在这里插入图片描述
作如下修改,否则在启动时报错。将前面的 # 号去掉,全部打开处于正常运行状态
在这里插入图片描述
再将nccos-mysql.sql脚本丢入到mysql数据库中,并且数据库名称为nacos
在这里插入图片描述
再将bin目录下的startup.cmd脚本打开
在这里插入图片描述
将26行的改成和下面的一样,都为standalone
在这里插入图片描述
接下来打来bin目录,点击startup.cmd运行即可,出现如下画面,则nacos安装成功!
在这里插入图片描述
由上图可知,端口号默认为8848,接下来打开浏览器访问一下,输入http://localhost:8848/nacos 即可,账号密码都是nacos,由于我做了集群配置因此出现了以下界面,刚开始肯定是一个登录页面的,我这里回不去了,账号密码一定都是nacos
在这里插入图片描述

四,编码以及集群的搭建

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

1,通用包api-commons

在这里插入图片描述
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

猜你喜欢

转载自blog.csdn.net/zhenghuishengq/article/details/113853752