Nacos注册中心

什么是nacos( Dynamic Naming and Configuration Service)?

Nacos是阿里巴巴的产品,是SpringCloud中的一个组件。相比Eureka功能更加丰富,社区活跃度高,Nacos替代Eureka做服务注册中心。

服务注册到Nacos

首先要有我们提供服务(提供者)注册到我们的nacos注册中心,然后由消费者去服务中心调用我们服务,

 我们整体的操作就是在父工程pom.xml中添加需要的依赖,其次就是一套小连招:

创建一个org.apache.maven.archetypes:maven-archetype-quickstart新模块-->在它的pom.xml添加nacos管理依赖以及其他需要-->在resources中书写application.yml文件配置端口、nacos地址等等-->编写启动类和controller业务逻辑-->启动微服务进行测试

开始

1.首先在父工程里面引入依赖:

​
<!--Spring cloud alibaba 2.1.0.RELEASE-->
      <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>

​

 2.在子模块pom.xml里面引入依赖

 <!-- SpringCloud alibaba nacos-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

​

3.配置nacos地址:

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

4.启动微服务,登录nacos管理页面,查看微服务信息

5.其他子模块也是同样的操作:

在pom.xml中添加依赖:

    <!-- SpringCloud alibaba nacos-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

配置nacos地址:

spring:
 application:
  name: nacos-order-consumer
 cloud:
  nacos:
   discovery:
    server-addr: localhost:8848

 启动服务,登录nacos管理页面

Nacos实现服务间的负载均衡

Nacos为啥支持负载均衡?

因为阿里的技术都是后面的技术包含前面的技术, nacos 出生后就自带了负载均衡这个功能 , 也即是说 nacos 的依赖包里面自带了ribbon 这个依赖。而Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
在这里我用了两个提供服务者和一个消费者,以便演示nacos的负载均衡
两个提供服务注册的端口一个设置为9001,一个是9002,而消费者端口为83
这里展示消费者开启负载均衡注解的代码:
@Configuration
public class ApplicationConfig {
    @Bean
    @LoadBalanced//开启负载均衡的注解
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

这里调用服务nacos-payment-provider

@Controller
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate resetTemplate;
    @Value("${service-url.nacos-user-service}")
    private String serverURL;
    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id")Long id){
        return resetTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }
}

配置文件application.yml

server:
 port: 83
spring:
 application:
  name: nacos-order-consumer
 cloud:
  nacos:
   discovery:
    server-addr: localhost:8848
service-url:
 nacos-user-service: http://nacos-payment-provider
http://localhost:83/consumer/payment/nacos/1 刷新就会发现 9001 9002 相互交替出现,这就是负载均衡 -- 轮询操作

Nacos控制台上配置服务权重

Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

在Nacos控制台,找到提供者服务的实例列表,点击编辑,即可修改权重:

注意:如果权重修改为0,则该实例永远不会被访问,l例如我将端口9002的权重改为0,消费者就只会访问提供服务9001了

注意Nacos默认是轮询。此时在控制台上修改服务的权重是无效的,仍然是轮询。 

要进行手动修改权重还需要在启动类添加

    @Bean
    @Scope(value = "prototype")
    public IRule loadBalanceRule() {
       return new NacosRule();
   }

这样我们在nacos控制台上面修改才是有效的

 这里端口9002--权重15,端口9001--端口1,权重越大访问频率越高。

记录测试Nacos注册中心遇到的bug

There was an unexpected error (type=Internal Server Error, status=500).

404 : [{"timestamp":"2023-10-23T11:06:28.126+0000","status":404,"error":"Not Found","message":"No message available","path":"/

解决方案:查看代码中路径是否正确以及是否将符号写错(绝对是)

com.alibaba.nacos.api.exception.NacosException: java.lang.reflect.InvocationTargetException

Caused by: java.lang.reflect.InvocationTargetException: null

Caused by: com.alibaba.nacos.api.exception.NacosException: endpoint is blank

解决方案: 

查看maven依赖的jar 是由于依赖引入了spring-cloud-alibaba-nacos-config(nacos作为配置中心)

    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
    </dependency>

而配置文件没有配置导致,源代码为判断了 serverAddrStr为空,然后endpoint 为空 所以抛出了异常,所以1.将依赖删掉 (我用的)2.创建文件bootstrap.yml 添加以下配置地址为 nacos地址

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException

解决方案:这个是请求路径出错

This application has no explicit mapping for /error, so you are seeing this as a fallback.

这个大致意思:这个应用没有明确的映射/错误,所以你才会看到这样一个返回结果 

解决方案:我的是将注解@Controller改为@RestController

@RestController 是 @Controller 和 @ResponseBody 两个注解的结合体。若需要对Controller的方法进行序列化,我们需要在返回值上使用@ResponseBody

我看网上的一些错误猜测是1.Application启动类的位置不对,2.在springboot的配置文件:application.yml或application.properties中关于视图解析器的配置问题(没遇到过),3.控制器的URL路径书写问题

Nacos注册中心,全称为Dynamic Naming and Configuration Service,是一个动态命名和配置服务。它是以服务为核心的注册中心和配置中心。 在分布式项目中,Nacos充当了注册中心的角色。它提供了服务注册和发现的功能,使得不同的服务能够方便地注册到Nacos上,并通过Nacos进行服务的发现。同时,Nacos还提供了配置中心的功能,可以将配置信息集中管理,并实时推送给相关的服务。 相比于其他的注册中心组件,Nacos具有灵活性和易用性。它支持多种注册方式,包括基于HTTP/REST的注册方式、基于DNS的注册方式以及基于RPC的注册方式。此外,Nacos还提供了丰富的API和界面,使得用户能够方便地管理和监控注册的服务和配置信息。 关于Nacos的下载安装和配置,可以通过官方网站进行下载,并按照官方文档的指引进行安装和配置。Nacos的目录结构和外部数据库的配置也可以在官方文档中找到相应的说明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Nacos学习之初识Nacos](https://blog.csdn.net/weixin_42601136/article/details/121761177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Nacos注册中心的部署与用法详细介绍](https://blog.csdn.net/a745233700/article/details/122915663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值