SpringCloud Alibaba Nacos 服务注册,负载均衡和配置中心

1 篇文章 0 订阅
1 篇文章 0 订阅

SpringCloud Alibaba Nacos 服务注册,负载均衡和配置中心

Nacos = Dynamic Naming And Configuration Service = Eureka + Config +Bus
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台
官方文档:https://github.com/alibaba/nacos
中文版本:https://nacos.io/zh-cn/index.html
按步骤,跟我做;
已测试,没报错;
最重要,是细心;
慢慢来,是大神。

所需环境

*** maven
*** jdk1.8+

Nacos安装

1、点击https://nacos.io/zh-cn/index.html
2、首页上可以看到有两个版本下载链接
这次采用一个低版本1.1.4作为测试,使用其他版本按照官网依赖关系,导入对应Springboot,SpringCloud以及Nacos依赖即可,查看版本说明,传送门:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
各组件与SpringCloud Alibaba版本关系
SpringCloud Alibaba与SpringBoot和SpringCloud版本关系
3、下载对应安装包,我这里下载Windows版本
安装包说明
4、下载完之后,直接解压即可。
nacos目录结构
5、运行
第一种方式:通过Ctrl + R,输入cmd,回车,进入命令行控制台,然后通过cd [nacos的bin目录],进入到nacos的bin目录下,在这里插入图片描述
然后再输入startup.cmd,回车。

在这里插入图片描述
不出意外,我们就可以看到nacos启动成功了,端口号就是上面的8848默认端口
6、打开nacos客户端
在浏览器直接输入,localhost:8848/nacos即可
至于为什么是8848这个端口号,可能是借用了珠穆朗玛峰的高度值(8848.86米),寓意还是很好的,“勇攀技术最高峰”
在这里插入图片描述

7、登录
账号/密码:nacos/nacos
在这里插入图片描述

一、Nacos实现服务注册

因为我本人使用的IDE是IntelliJ IDEA,所以我这里就在Idea中进行演示,Eclipse使用者可能目录结构有所不同,不过大概的配置都差不多。
1、建一个父工程
父工程什么都不需要,只需要一个Pom即可,将依赖的版本传递给给子模块。相关依赖和插件配置如下,按需配置即可:

<!--pom.xml-->
<dependencyManagement>
        <dependencies>
            <!--      spring boot 2.2.2.RELEASE-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.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.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库驱动包-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
<!--            druid连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
<!--            mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
<!--        maven插件-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.2</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

2、在父工程下建一个子Module
(1)pom.xml如下:

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.qzwise.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>
<!--        mybatis包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
<!--        druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
<!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
<!--        spring-boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
<!--        热启动工具,修改代码自动加载-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
<!--        lombok工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
<!--        test测试包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

(2)在resources目录下,创建applciation.yml,配置如下

server:
  port: 9001
spring:
  application:
    name: cloud-nacos-provider9001
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   # nacos地址

# 配置actuator暴露的端点
management:
  endpoints:
    web:
      exposure:
        include: "*"    # * 表示暴露所有端点

(3)创建一个主启动类,其内容如下:

package com.springcloud.alibabaNacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(CloudNacosMain9001.class, args);
    }
}

(4)写一个简单的controller进行测试

package com.springcloud.alibaba.alibabaNacos.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Long
 * @create 2022-01-06 20:34
 */
@RestController
@RequestMapping("/provider")
public class NacosController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/nacos")
    public String getNacosMsg() {
        return "Nacos Server Registry,Port:" + serverPort;
    }
}


(5)运行我们的项目
在这里插入图片描述
(6)测试
在浏览器输入localhost:9001/provider/nacos即可看到成功显示
在这里插入图片描述
然后我们打开nacos客户端,也可以看到我们的服务已经注册到nacos中
在这里插入图片描述

二、Nacos实现负载均衡

为了体现nacos的负载均衡能力,我们必须多建几个服务,微服务名称一样,来组成集群,通过nacos自带的ribbon来达到负载均衡的目的。
这里我们可以直接将上面已经建好的模块,再建一个跟他一模一样的,pom,controller都一样,唯一不同的是yml中的端口号我们换一个
在这里插入图片描述
两个服务都建好之后,都启动起来,然后打开nacos客户端,我们可以看到
在这里插入图片描述
有两个服务名一样的实例,那么怎么测试调用这个服务,能达到负载均衡效果呢?
我们不妨再创建一个消费者服务,来调用这两个服务提供者实例
1、再建一个模块
2、pom.xml

<dependencies>
<!--        open-feign组件,可以简化封装我们的http调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
<!--        nacos服务注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
<!--        web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        actuator组件-->
        <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>
<!--        lombok组件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
<!--        test组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3、application.yml

server:
  port: 83
spring:
  application:
    name: cloud-consumer-nacos-order83
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   # nacos地址

service-url:
  nacos-user-service: http://cloud-nacos-provider   # 将调用服务的地址放在配置文件中,来达到与代码解耦的目的

4、主启动类

package com.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author Long
 * @create 2022-01-06 20:43
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerMain83 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerMain83.class, args);
    }
}

5、因为需要调用另一个服务,我们需要单独写个配置类,注入RestTemplate
package com.springcloud.alibaba.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**

  • @author Long
  • @create 2022-01-06 20:47
    */
    @Configuration
    public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
    return new RestTemplate();
    }
    }
    这个类需要在Spring能扫描的地方,如下:
    在这里插入图片描述
    主启动类在这个包的根目录,所以在这个包下,同级或者子包下Spring都能扫描到
    6、建一个简单的controller,来调用服务提供者的接口
package com.springcloud.alibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;

/**
 * @author Long
 * @create 2022-01-06 20:49
 */
@RestController
@RequestMapping("/order")
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String SERVER_URL;

    @GetMapping("/nacos")
    public String paymentInfo() {
        return restTemplate.getForObject(SERVER_URL + "/provider/nacos", String.class);
    }
}

7、建好之后,启动该消费者服务
(1)看nacos客户端
在这里插入图片描述
可以看到,服务消费者和服务提供者的实例都已经注册到nacos了
(2)打开浏览器,输入http://localhost:83/order/nacos,访问消费者接口
在这里插入图片描述
在这里插入图片描述
可以看到,成功通过消费者服务调用到了服务提供者,并且可以看到调用的是端口为9001那个实例。当我们再刷新一下,又可以看到,调用的的9002那个实例。
因为nacos自带的ribbon,默认的负载均衡规则是轮询,就是有同一个服务名称的多个实例,会循环调用
在这里插入图片描述

三、Nacos实现配置中心

这里我们再创建一个模块,来完成config配置
1、新建一个module,pom.xml如下:

<dependencies>
        <!--nacos 配置中心支持-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--        open-feign组件,可以简化封装我们的http调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--        nacos服务注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--        web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--        actuator组件-->
        <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>
        <!--        lombok组件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--        test组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2、bootstrap.yml和application.yml

# boostrap.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  # 其实yml全称就是yaml,所以这里配置它的全称yaml,指定yaml格式的配置

# application.yml
spring:
  profiles:
    active: dev   # 启用开发环境配置

这里做个扩展:
nacos通springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,读取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap.yml优先级高于application.yml
*** 我们可以将全局通用配置放在bootstrap.yml中,个性化配置放在application.yml
3、主启动类
package com.springcloud.nacosconfig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**

  • @author Long
  • @create 2022-01-06 21:41
    */
    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosConfigMain3377 {
    public static void main(String[] args) {
    SpringApplication.run(NacosConfigMain3377.class, args);
    }
    }
    4、写一个简单的controller,用来读取在nacos客户端配置的信息
    package com.springcloud.nacosconfig.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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**

  • @author Long

  • @create 2022-01-06 21:51
    */
    @RestController
    @RefreshScope //提供nacos的动态刷新功能
    @RequestMapping("/config")
    public class ConfigClientController {
    // 读取从nacos客户端配置的信息
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/info")
    public String getConfigInfo() {
    return configInfo;
    }
    }
    5、我们打开nacos客户端
    在这里插入图片描述
    在配置管理-配置列表中,点击+号新增一个配置文件

在这里插入图片描述
这里的Data ID是有规则的,按照以下格式来填写
s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name{spring.profile.active}.${spring.cloud.nacos.config.file-extension}
spring.application.name:就是上面我们配置的服务名 nacos-config-client
spring.profile.active:这个是我们在application.yml中配置的启用的配置环境名“dev”
spring.cloud.nacos.config.file-extension(文件后缀):就是我们上面写的yaml
其实上面这些都可以根据配置中的节点顺着找到
所以我们把这三部分拼起来,我们这里的Data ID就是:nacos-config-client-dev.yaml

填完之后,点击发布,返回,我们就可以看到配置文件已经加上去了
在这里插入图片描述
6、配置完成之后,启动我们的配置服务
打开浏览器,输入http://localhost:3377/config/info访问刚才服务的接口,就可以看到接口中成功读取到我们在nacos配置中心里面的内容了
在这里插入图片描述
在这里插入图片描述
至此,nacos 服务注册,负载均衡以及配置中心大致功能就完成了

这里所有的演示,都是用的最简化的方式来进行,如果需要,可以对其中的一些配置,依赖按需进行完善。
希望大家点赞转发,有任何问题,欢迎大家踊跃留言!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值