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路径书写问题

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值