5、alibaba微服务nacos的引入和使用

1、项目中引入nacos

父项目中已经引入了spring-cloud-alibaba,这个里面就已经包含nacos依赖了,所以在子项目中引入nacos依赖不用添加版本信息

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos-服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

引入之后需要在子项目的application.yml中添加服务的名称和nacos服务地址信息

server:
  port: 8020
  #应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 192.168.1.146:8848
      discovery:
        #不配置,默认的就是nacos
        username: nacos
        password: nacos
        #namespace的默认值就是public,可以不用配置
        namespace: public
server:
  port: 8021
  #应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: stock-service
  cloud:
    nacos:
      server-addr: 192.168.1.146:8848
      discovery:
        #不配置,默认的就是nacos
        username: nacos
        password: nacos
        #namespace的默认值就是public,可以不用配置
        namespace: public

然后咱们启动这两个服务

 通过日志,咱们可以看到服务已经注册到nacos中了,那么咱们访问下nacos

 可以看到服务已经注册到nacos中了。

点击操作列的“详情”,可以看到详细的元数据信息

 如果将服务停止,15s左右健康状况改成false,如果20s-30s左右检测不到心跳,会将这个服务剔除掉。

2、代码中对nacos的使用

通过order中调用stock库存的原先的代码

package com.chinasofti.order.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author mxx
 * @Date 2023/6/12 16:44
 * @Version 1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    RestTemplate restTemplate;
    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        String msg=restTemplate.getForObject("http://localhost:8011/stock/reduct",String.class);
        return "Hello World!"+msg;
    }
}

引入nacos之后的代码:

package com.chinasofti.order.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author mxx
 * @Date 2023/6/12 16:44
 * @Version 1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    RestTemplate restTemplate;
    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        String msg=restTemplate.getForObject("http://stock-service/stock/reduct",String.class);
        return "Hello World!"+msg;
    }
}

重启下order的服务,调用下add方法看看

访问失败了,这是为啥呢,原因是nacos解析不了ip端口这些东西,它需要负载均衡器进行调用,负载均衡器默认采用轮询的方式调用库存服务,nacos默认采用的负载均衡是Ribbon

怎么引入负载均衡器呢,咱们在咱的RestTemplate中加一个注解 @LoadBalanced,如下:

package com.chinasofti.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @Author mxx
 * @Date 2023/6/12 16:55
 * @Version 1.0
 */
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate =  builder.build();
        return restTemplate;
    }
}

然后重启order服务再次访问,成功了,如下:

咱们如何测试nacos的负载均衡器的轮询的方式呢,咱们通过将stock复制一份出来

将复制出来的server.port 端口修改为8022

 

 为了方便查看咱们到底请求的是哪个stock,那么咱们修改下stock的代码,加上访问的端口

package com.chinasofti.stock.controller;

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

/**
 * @Author mxx
 * @Date 2023/6/12 16:48
 * @Version 1.0
 */
@RestController
@RequestMapping("/stock")
public class StockController {
    @Value("${server.port}")
    String port;
    @RequestMapping("/reduct")
    public String reduct(){
        System.out.println("扣减库存");
        return "扣减库存:"+port;
    }
}

 然后咱们将这三个服务都启动起来,再访问下订单的地址

多次刷新,发现一会访问的是8021,一会访问的是8022,这样咱们就实现轮询了 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Cloud Alibaba是Spring Cloud的一个子项目,它是阿里巴巴微服务生态的重要组成部分,提供了一系列基于Spring Boot和Spring Cloud的微服务组件,如服务注册与发现、配置管理、负载均衡、服务调用、熔断器等。而Nacos作为一个新兴的服务发现和配置心,可以方便地进行服务治理。 Spring Cloud Alibaba整合Nacos的过程相对简单,只需要引入相关依赖,并在代码使用对应的注解进行配置即可。 首先,在pom.xml文件添加以下依赖: ```xml <!-- Nacos Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 然后,在启动类上使用@EnableDiscoveryClient注解启用Nacos服务注册与发现功能: ```java @SpringBootApplication @EnableDiscoveryClient public class DemoApplication{ public static void main(String[] args){ SpringApplication.run(DemoApplication.class,args); } } ``` 接下来就可以使用@NacosValue注解注入配置信息: ```java @RestController public class DemoController{ @NacosValue(value="${config.key}",autoRefreshed=true) private String configValue; @GetMapping("/config") public String getConfig(){ return configValue; } } ``` 这样就可以通过Nacos Config来动态修改配置信息了。另外,Spring Cloud Alibaba还提供了一些其他有用的组件,如Sentinel、Seata等,可以方便地进行服务治理和分布式事务管理。 总的来说,Spring Cloud Alibaba整合Nacos是一个极为方便且实用的方式,它可以大大简化微服务应用的开发和部署,提高了系统的可靠性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱人间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值