Spring Cloud Alibaba Nacos服务注册和负载均衡

一、Nacos简介

Nacos命名的前四个字母分别取自Naming(服务注册,即服务命名管理)和Configuration(服务配置)的前两个字母,s取自Service,也就是服务的意思。它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

简单一句话:Nacos 等价于 注册中心 + 配置中心 类似于 Eureka + Config + Bus

Nacos官网地址:https://nacos.io/zh-cn/,可以在这里下载和查阅官方文档。

二、安装并运行Nacos(Windows系统)

通过Nacos下载地址选择合适的版本(最好选稳定版本)下载zip包,需要本地配置好了Java8Maven环境,解压缩后,运行startup.cmd启动Nacos,浏览器访问http://localhost:8848/nacos查看管理后台,输入用户名密码(都是nacos)进入。

1、修改nacos的运行模式为"单机模式"

2、双击"startup.cmd"文件,运行nacos

3、打开nacos页面

在浏览器中打开:http://192.168.10.3:8848/nacos/index.html

三、Nacos作为服务注册中心演示

1、基于Nacos的服务提供者

(1)创建Maven项目nacos-demo,删除src文件夹。在pom.xml文件中添加spring cloud alibaba依赖,代码如下:

<dependencyManagement>
        <dependencies>
            <!-- spring cloud alibaba 2021.0.4.0 依赖 
            强调:注意spring cloud alibaba nacos的版本号要与SpringBoot的版本号要匹配
            -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

(2)在nacos-demo下新建nacos-provider模块

该模块的pom.xml如下:

<dependencies>
        <!-- 引用spring cloud alibaba nacos注册中心/服务发现依赖
            强调:注意spring cloud alibaba nacos的版本号要与SpringBoot的版本号要匹配
        -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.0.4.0</version>
        </dependency>
        <!-- 引用父级spring boot的依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 引用父级spring boot健康监控的依赖 -->
        <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

(3)nacos-provider模块的application.yml文件:

# 配置服务器的端口号
server:
  port: 9001

spring:
  application:
    name: nacos-provider #应用名称
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.10.3:8848 #nacos服务器地址和端口号

# 暴露所有监控端口
management:
  endpoints:
    web:
      exposure:
        include:  "*"

(4)nacos-provider模块的启动类

package com.nacos.nacosprovider;

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

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

(5)nacos-provider模块的Controller

package com.nacos.nacosprovider.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;

import java.util.List;

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "Hello Nacos Discovery " + serverPort + "payment id: " + id ;
    }

    @GetMapping("/info")
    public List<String> getInfo(){
        return List.of("张三","李四","王五");
    }
}

(6)运行nacos-provider模块

(7)启动Nacos服务,在浏览器中访问http://192.168.10.3:8848//nacos,点击左侧“服务管理”-“服务列表”即可看到nacos-provider服务已经注册进来了。

(8)访问nacos-provider模块的Controller

(8)新建第二个服务提供者模块(nacos-provider1),端口号为9002,它的application.yml文件如下

pom.xml文件和启动类与nacos-provider一样

(9)nacos-provider1模块的Controller如下:

(10)启动nacos-provider、nacos-provider1,查看Nacos管理后台,nacos-payment-provider服务名对应的实例数由1变成了2。如图所示

2、基于Nacos的服务消费者和负载

因为spring-cloud-starter-alibaba-nacos-discovery依赖集成了ribbon,所以能实现负载均衡。

(1)创建服务消费者consumer-nacos-order模块,pom.xml文件和nacos-provider模块一样。

注意:需要在pom.xml中添加负载均衡的依赖

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-loadbalancer</artifactId>
     <version>3.1.6</version>
 </dependency>

(2)配置consumer-nacos-order模块的application.yml文件

server:
  port: 8083

# 配置应用信息
spring:
  application:
    name: nacos-order-consumer # 配置应用名称
  cloud:
    # nacos配置
    nacos:
      discovery:
        server-addr: 192.168.10.3:8848 # 配置Nacos地址

# 消费者将去访问的微服务地址,这里采用服务名称查找服务(成功注册进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-provider

(3)consumer-nacos-order模块的主启动类

package com.start.consumernacosorder;

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

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerNacosOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerNacosOrderApplication.class, args);
    }
}

(4)定义consumer-nacos-order模块的配置类

package com.start.consumernacosorder.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;

@Configuration
public class ApplicationContextConfig {

    /**
     * 获取RestTemplate对象
     * @LoadBalanced:开启RestTemplate负载均衡,轮询方式
     * @return 返回RestTemplate对象
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

注意,这里一定要带上@LoadBalanced注解,因为我们是通过服务名访问生产者的,现在同一个服务名称有两个生产者就没有办法具体解析到哪一个生产者中了,要通过负载均衡来分发。即使只有一个生产者,通过服务名访问,也要带上@LoadBalanced注解,否则会报java.net.UnknownHostException错:

(5)定义consumer-nacos-order模块的Controller

package com.start.consumernacosorder.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;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
public class OrderController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}") //application.yml中配置的nacos-user-service
    private String serverUrl;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String getCustomerInfo(@PathVariable("id") Integer id){
        return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
    }
}

(6)启动Nacos服务,启动两个生产者一个消费者,在不同的浏览器页面中访问http://localhost:8083/consu

mer/payment/nacos/1,根据请求返回值,可以看到负载均衡生效了,实际上,Nacos有负载均衡能力,是因为它包含了Ribbonjar包。

四、服务注册中心对比

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上庸者-不服周

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

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

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

打赏作者

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

抵扣说明:

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

余额充值