当前位置: 首页>后端>正文

SpringCloud整合Nacos服务注册与发现

?? 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址
?? 作者:一只IT攻城狮。关注我,不迷路。
?? 再小的收获x365天都会成就不一样的自己,一起学习,一起进步。
??Nacos简介、安装、运行参看上一节: SpringCloud入门实战-Nacos简介、安装、运行详解

一、项目准备(Nacos+SpringBoot+OpenFeign)

SpringCloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体。而SpringCloud Alibaba是SpringCloud中一个重要项目,Nacos作为SpringCloud Alibaba项目中的一项重要组件,我们需要重点去了解和学习。

我们知道使用 Nacos 是简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。Nacos = Eureka + Config + bus可以替代Eureka做服务注册中心,可以替代Config做服务配置中心。

那我们结合项目具体来学习一下优秀的Nacos作为注册中心是如何使用的。

二、构建Nacos之服务提供者

可以先准备好nacos环境:进入的nacos的bin目录,启动服务器 : sh startup.sh -m standalone
访问http://localhost:8848/nacos看到界面即成功启动。接下来搭建项目。

1、pom中引入依赖

新建父工程cloud-nacos。

1)父pom中引入spring-cloud-alibaba-dependencies依赖,注意SpringBoot、SpringCloud、Spring Cloud Alibaba及组件间版本问题。可参看SpringBoot、SpringCloud、Spring Cloud Alibaba版本对照表(详细准确)。我的版本如下:

 <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2021.0.4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <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>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.7.1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

提示:搭建好项目,如果后续启动测试时也会报错:
Could not initialize class com.alibaba.nacos.common.remote.client.grpc.GrpcSdkClient
那也是因为引用的spring cloud 版本,alibaba cloud版本,nacos的版本不一致导致的。

2)新建子module,cloud-payment工程作为服务提供者,pom引入spring-cloud-starter-alibaba-nacos-discovery依赖:

    <dependency>
    <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

提示:由于Netflix Ribbon 进入停更维护阶段,因此SpringCloud 2020.0.1 版本之后,删除了eureka中的ribbon, 替代ribbon的是spring cloud自带的LoadBalancer,默认使用的是轮询的方式,新版本的 Nacos discovery 都已经移除了 Ribbon ,因此我们使用Nacos时也需要引入loadbalancer 才能调起服务。

2、yml文件增加配置

cloud:
  nacos:
    discovery:
      # 配置 nacos 的服务地址
      server-addr: localhost:8848
management:
endpoints:
  web:
    exposure:
      include: '*'

3、启动类

启动类增加注解:@EnableDiscoveryClient

4、测试

编写简单的查询业务类,并启动服务,可以看到nacos上实例数变成2

SpringCloud整合Nacos服务注册与发现,第1张

SpringCloud整合Nacos服务注册与发现,第2张

三、构建Nacos之服务消费者

1、pom中引入依赖

新建module:cloud-order。这里我引入了spring-cloud-starter-openfeign通过openfeign代替Ribbon+RestTemplate方式调用服务提供者。

提示:openfeign知识传送门:SpringCloud入门实战-OpenFeign服务调用

附上完整pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-nacos</artifactId>
        <groupId>org.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-order</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.test</groupId>
            <artifactId>cloud-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 
        </dependency>
        <!--使用Spring Cloud LoadBalancer 进行客户端负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <!-- devtools热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

2、yml文件配置

server:
  port: 80

spring:
    application:
      name: cloud-order #微服务应用的名字
    cloud:
      nacos:
        discovery:
          server-addr: localhost:8848
## 消费者将要去访问的微服务名称( 注册成功进 nacos 的微服务提供者)
service-url:
  nacos-user-service: http://cloud-payment

3、启动类

启动类增加注解:@EnableDiscoveryClient 以及开启feign的调用@EnableFeignClients

/**
 * @author qy
 * @date 2022年07月13日 16:46
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
public class CloudOrder {
    public static void main(String[] args) {
        SpringApplication.run(CloudOrder.class, args);
    }
}

4、测试

编写简单的查询业务类,并启动服务,可以看到nacos上实例数变成3

重点代码:

/**
 * 
 * OrderController.java
 */
@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
    @Resource
    private PaymentService paymentService;

    @GetMapping(value = "/ok/{id}")
    public String paymentInfoOk(@PathVariable("id") Integer id) {
        String result = paymentService.paymentInfoOk(id);
        log.info("========result:{}========", result);
        return result;
    }


    @GetMapping(value = "/timeout/{id}")
    public String paymentInfoTimeOut(@PathVariable("id") Integer id) {
        String result = paymentService.paymentInfoTimeOut(id);
        log.info("========result:{}========", result);
        return result;
    }
}


/**
 * 
 * Feign接口类 PaymentService.java
 */
@Component
@FeignClient(value = "cloud-payment",fallback = PaymentFallbackService.class)
public interface PaymentService {

    @GetMapping(value = "/payment/ok/{id}")
    String paymentInfoOk(@PathVariable("id") Integer id);

    @GetMapping(value = "/payment/timeout/{id}")
    String paymentInfoTimeOut(@PathVariable("id") Integer id);
}



@Component
public class PaymentFallbackService implements PaymentService {
    @Override
    public String paymentInfoOk(Integer id) {
        return "全局解耦降级处理PaymentFallback->paymentInfoOk!";
    }

    @Override
    public String paymentInfoTimeOut(Integer id) {
        return "全局解耦降级处理PaymentFallback->paymentInfoTimeOut!";
    }
}
SpringCloud整合Nacos服务注册与发现,第3张

访问http://localhost/order/ok/1测试,多次调用,轮询访问。
SpringCloud整合Nacos服务注册与发现,第4张

如果你的应用测试报错:Load balancer does not contain an instance for the service ..参看:解决办法。

Nacos作为服务注册与发现的项目实战就到这里了。下一节,我们再详细介绍Nacos服务配置中心、Nacos集群和持久化配置。


https://www.xamrdz.com/backend/3zg1926891.html

相关文章: