Nacos入门与服务者提供小案例

什么是Nacos

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

架构图

一图看懂 Nacos,下面架构部分会详细介绍。
在这里插入图片描述
特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
架构大图:通过清晰架构,让您快速进入 Nacos 世界
业务大图:利用当前特性可以支持的业务场景,及其最佳实践
生态大图:系统梳理 Nacos 和主流技术生态的关系
优势大图:展示 Nacos 核心竞争力
战略大图:要从战略到战术层面讲 Nacos 的宏观优势

生态图

在这里插入图片描述

实战展示

话不多说,理论知识要搞好,实战才是硬道,首先先把环境配置搞定再说

Nacos环境

Nacos下载路径: https://github.com/alibaba/nacos/tree/develop/distribution.

启动

Linux/Unix/Mac

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows
启动命令(standalone代表着单机模式运行,非集群模式):

cmd startup.cmd -m standalone

我这里用的是windows系统进行测试,下载后也可以直接在目录下的bin目录下打开startup.cmd即可,效果如下
在这里插入图片描述
打开后就可以访问该目录,会有一个UI管理器界面
在这里插入图片描述
当可以进入这个界面之后,证明你的nacos已经是没什么问题了,然后登陆账号密码都是nacos,输入即可展现如下画面
在这里插入图片描述

依赖

这边基本上是已经没什么问题了,那么这次展现的是SpringBoot整合Nacos的一个小案例,那么下面创建一个SpringBoot项目,这里就不做演示了,下面直接操作,首先老样子加入一个Maven的依赖包,如下

<dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-spring-context</artifactId>
        <version>1.1.0</version>
</dependency>

配置

在 application.properties 中配置 Nacos server 的地址

nacos.config.server-addr=127.0.0.1:8848

启动类加上Nacos注解

@NacosPropertySource(dataId = "example", autoRefreshed = true)

编写配置类

package com.nacos.nacosdb.config;

import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.context.annotation.Configuration;

/**
 * @Author uncletj
 * @Date 2021/4/19 17:42
 * @Version SpringBoot 2.2.2
 * @projectName
 */
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {

}

编写控制类

package com.nacos.nacosdb.controller;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import static org.springframework.web.bind.annotation.RequestMethod.GET;


/**
 * @Author uncletj
 * @Date 2021/4/19 15:03
 * @Version SpringBoot 2.2.2
 * @projectName
 */
@Controller
@RequestMapping("config")
public class ConfigController {

    @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
    private boolean useLocalCache;

    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public boolean get() {
        return useLocalCache;
    }
}

然后我们使用cURL进行一波测试看看返回的内容是什么

什么是cURL

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl

下载安装传送门

cURL下载路径: https://curl.se/download.html.

测试

下载后即可在cmd内进行使用,既然都一步俱全了下面就来测试吧
首先在cURL内输入curl http://localhost:8080/config/get测试看看
在这里插入图片描述
返回为false,因为我们还没对Nacos进行配置,下面我们在去向 Nacos server 发布配置:dataId 为example,内容为useLocalCache=true,具体如下

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"

在这里插入图片描述
既然它都true了,那么自然应该是没什么毛病了,并且还可以在我们的配置列表中看见有一个配置
在这里插入图片描述
这里有配置了,那再去访问上面那条url试试,这回应该就是true了
在这里插入图片描述

服务发现

服务提供者(discovery)

项目结构图

首先这边使用的是多模块项目,具体结构如下图,首先是创建了一个名为cloud的父项目,然后在父级文件下创建了一个product的子项目
在这里插入图片描述

POM

首先我们先把父级的依赖先完善好
cloud.pom

<?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 https://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.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.luas.cloud</groupId>
    <artifactId>cloud</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>java-boot-parent-2.1</name>
    <description>Spring Cloud Learning, parent project by spring boot 2.1.x</description>

    <properties>
        <java.version>1.8</java.version>
        <hutool.version>4.6.13</hutool.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

然后子级别的的pom当然要与父级的相连通
product.pom

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.luas.cloud</groupId>
        <artifactId>java-boot-parent-2.1</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../../cloud</relativePath>
    </parent>

    <groupId>com.luas.cloud</groupId>
    <artifactId>product</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <name>xmall-product</name>
    <description>Spring Cloud Learning,nacos-client</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- nacos cloud -->
        <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-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

YML配置

server:
  port: 8081

spring:
  application:
    name: uncletj
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

注意,spring.application.name将作为uncletj服务在nacos注册后的服务名称,该服务名称非常重要,后续无论是通过feign调用,还是rest调用,均需要此名称
这里只是配置了一下启动tomcat的端口号与Nacos的连接端口与服务列表的服务名,下面在写一个简单的demo测试一下

DEMO

个人介绍

import cn.hutool.core.map.MapUtil;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author uncletj
 * @Date 2021/4/20 14:22
 * @Version SpringBoot 2.2.2
 * @projectName 个人介绍
 */
@RestController
@RequestMapping("/person")
public class PersonController {

    @RequestMapping("/{id}")
    public Object get(@PathVariable("id") String id) {
        return MapUtil.<String, Object>builder()
                .put("id", id)
                .put("name", "藤井大叔")
                .put("gender", "男")
                .put("age","22")
                .put("hobby","是一个宅男")
                .build();
    }
}

运行看看,然后打开nacos控制台,发现访问已然在列表中,注册成功!可以点击详情查看服务元数据

在这里插入图片描述
然后在访问一下http://localhost:8081/person/1,得出以下结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

藤井大叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值