Nacos的搭建及服务调用

文章目录

  • 一、搭建Nacos服务
    • 1、Nacos
    • 2、安装Nacos
    • 3、Docker安装Nacos
  • 二、OpenFeign和Dubbo远程调用Nacos的服务
    • 1、搭建SpringCloudAlibaba的开发环境
      • 1.1 构建微服务聚合父工程
      • 1.2 创建子模块cloud-provider-payment8001
      • 1.3 创建子模块cloud-consumer-order80
    • 2、远程服务调用OpenFeign
      • 2.1 Dubbo和OpenFeign的区别
      • 2.2 创建子模块cloud-consumer-openfeign-order80
      • 2.3 OpenFeign实现服务降级
    • 3、远程服务调用Dubbo
      • 3.1 创建接口服务工程cloud-service-api
      • 3.2 创建支付生产者工程cloud-dubbo-provider-payment8001
      • 3.3创建消费者cloud-dubbo-consumer-order80
      • 3.4 Dubbo实现服务降级
  • 总结

一、搭建Nacos服务

1、Nacos

  1. Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开发者提供一款便捷、简单上手的开源框架。
    Nacos包含了SpringCloud的注册中心Eureka、服务配置Config、服务总线Bus。
  2. Nacos提供四大功能,分别是服务发现和服务健康监测、动态配置服务、动态DNS服务、服务及其元数据管理。
    1)服务发现和服务健康监测
    Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
    2)动态配置服务
    动态配置服务允许在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这使得配置的更改更加高效和灵活。
    3)动态DNS服务
    Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让第三方应用方便查阅及发现。
    4)服务及其元数据管理
    Nacos能让你从微服务平台建设的视觉去管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

2、安装Nacos

  1. 在官网下载Linux的Nacos安装包:https://github.com/alibaba/nacos/releases
  2. 通过mobax将安装包上传到虚拟机的/opt目录下
  3. 解压到/usr/local目录下:tar -zxvf nacos-server-2.2.3.tar.gz -C /usr/local
  4. 需要在虚拟机上配置JDK8以上的环境:https://blog.csdn.net/weixin_49076273/article/details/126636650
  5. 进入到nacos的bin目录下,启动单机模式的nacos服务器:sh startup.sh -m standalone
  6. 在浏览器访问:http://192.168.126.32:8848/nacos/
    在这里插入图片描述

3、Docker安装Nacos

  1. 安装Docker:https://blog.csdn.net/weixin_49076273/article/details/126532188

  2. 使用Docker拉取镜像:docker pull nacos/nacos-server:v2.2.0

  3. 单机版部署:docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone -e NACOS_SERVER_IP=192.168.126.32 nacos/nacos-server:v2.2.0

  4. 在浏览器访问:http://192.168.126.32:8848/nacos/
    在这里插入图片描述帐号密码都是nacos

    使用docker容器搭建nacos,如果是nacos2.x需要把9848,9849这两个端口开放出来即可,这样就可以使用IDEA连接上Nacos。如果是1.x则直接使用8848端口即可

二、OpenFeign和Dubbo远程调用Nacos的服务

1、搭建SpringCloudAlibaba的开发环境

1.1 构建微服务聚合父工程

  1. 创建父工程springcloudalibaba
    在这里插入图片描述

  2. 配置注解生效激活
    在这里插入图片描述

  3. Java编译版本选择
    在这里插入图片描述

  4. 父工程的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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.zzx</groupId>
        <artifactId>springcloudalibaba</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
        <!-- 统一管理jar包版本 -->
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <spring-cloud.version>2021.0.0</spring-cloud.version>
            <spring-boot.version>2.6.3</spring-boot.version>
        </properties>
    
        <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
        <dependencyManagement>
            <dependencies>
                <!--spring boot 2.6.3-->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-parent</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <!--spring cloud 2021.0.0-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    
  5. IDEA开启Dashboard
    1)修改配置文件.idea/workspace.xml
    2)添加如下配置

     <component name="RunDashboard">
     <option name="ruleStates">
      <list>
       <RuleState>
        <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
       </RuleState>
       <RuleState>
        <option name="name" value="StatusDashboardGroupingRule" />
       </RuleState>
      </list>
     </option>
     <option name="configurationTypes">
     <set>
      <option value="SpringBootApplicationConfigurationType" />
     </set>
    </option>
    </component>
    
  6. 删除src目录

1.2 创建子模块cloud-provider-payment8001

  1. 在父工程下,右键创建子模块cloud-provider-payment8001
    在这里插入图片描述

  2. 在cloud-provider-payment8001的POM文件中添加如下依赖

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    
  3. 创建cloud-provider-payment8001的主启动类

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 主启动类
     */
    
    // 注解开启注册发现服务功能
    @EnableDiscoveryClient
    @SpringBootApplication
    @Slf4j
    public class PaymentMain8001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8001.class,args);
            log.info("******  PaymentMain8001 启动成功   ******");
        }
    }
    
    
  4. 在cloud-provider-payment8001的com.zzx.controller包下,创建PaymentController

    package com.zzx.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 支付控制层
     */
    @RestController
    @RequestMapping("payment")
    public class PaymentController {
        @GetMapping("index")
        public String index(){
            return "payment success";
        }
    }
    
  5. 在cloud-provider-payment8001的resources中,创建application.yml文件

    server:
      port: 8001
    spring:
      application:
        name: payment-provider
      cloud:
        nacos:
          discovery:
            # Nacos服务的地址
            server-addr: 192.168.126.32:8848
    
  6. 启动payment8001项目后,在Nacos中的服务管理的服务列表中会出现该服务
    在这里插入图片描述

1.3 创建子模块cloud-consumer-order80

  1. 在父工程下,右键创建子模块cloud-consumer-order80
    在这里插入图片描述

  2. 在cloud-consumer-order80的POM文件中添加如下依赖

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    
  3. 创建cloud-consumer-order80的主启动类

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 主启动类
     */
    
    // 注解开启注册发现服务功能
    @EnableDiscoveryClient
    @SpringBootApplication
    @Slf4j
    public class OrderMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderMain80.class,args);
            log.info("******  OrderMain80 启动成功   ******");
        }
    }
    
    
  4. 在cloud-consumer-order80的resources中,创建application.yml文件

    server:
      port: 80
    spring:
      application:
        name: order-consumer
      cloud:
        nacos:
          discovery:
            # Nacos服务的地址
            server-addr: 192.168.126.32:8848
    
  5. 启动order80项目后,在Nacos中的服务管理的服务列表中会出现该服务
    在这里插入图片描述

2、远程服务调用OpenFeign

2.1 Dubbo和OpenFeign的区别

  1. Apache Dubbo是一款微服务开发框架,他提供了RPC通信与微服务治理两大关键能力。这意味着使用Dubbo开发的微服务,将具备相互之间的远程发现和通信能力,同时利用Dubbo提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调控等服务治理诉求。
  2. SpringCloud的通信采用OpenFeign组件。Feign基于Http传输协议,底层实现是Rest。从OSI7层模型上来看Rest属于应用层。
    OpenFeign在高并发场景下性能不够理想,成为性能瓶颈。
    使用场景:并发不高,性能要求也不高
  3. Dubbo框架的通信协议采用RPC协议,属于传输层协议,性能上自然比rest高。提升了交互的性能,保持了长连接,高性能。
    Dubbo性能更好,比如支持异步调用、Netty性能更好。
    使用场景:数据小,并发高

2.2 创建子模块cloud-consumer-openfeign-order80

  1. 在父工程下,右键创建子模块cloud-consumer-openfeign-order80
    在这里插入图片描述

  2. 在cloud-consumer-openfeign-order80的POM文件中添加如下依赖

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 引入openfeign依赖包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- 引入负载均衡器依赖包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>
    
  3. 创建cloud-consumer-openfeign-order80的主启动类

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    /**
     * 主启动类
     */
    
    // 注解开启注册发现服务功能
    @EnableDiscoveryClient
    // 开启feign扫描
    @EnableFeignClients
    @SpringBootApplication
    @Slf4j
    public class OrderOpenFeignMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderOpenFeignMain80.class,args);
            log.info("******  OrderOpenFeignMain80 启动成功   ******");
        }
    }
    
    
  4. 在cloud-consumer-openfeign-order80的com.zzx.service包中,创建IPaymentFeignService接口

    package com.zzx.service;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.GetMapping;
    
    /**
     * OpenFeign远程调用
     */
    @Service
    @FeignClient(value = "payment-provider")
    public interface IPaymentFeignService {
        @GetMapping("/payment/index")
        String index();
    }
    
    
  5. 在cloud-consumer-openfeign-order80的com.zzx.controller包中,创建OrderController

    package com.zzx.controller;
    
    import com.zzx.service.IPaymentFeignService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 订单微服务
     */
    @RestController
    @RequestMapping("order")
    public class OrderController {
        @Autowired
        private IPaymentFeignService iPaymentFeignService;
        /**
         * 测试OpenFeign
         * @return
         */
        @GetMapping("index")
        public String index(){
            return iPaymentFeignService.index();
        }
    }
    
    
  6. 在cloud-consumer-openfeign-order80的resources中,创建application.yml文件

    server:
      port: 80
    spring:
      application:
        name: order-consumer-openfeign
      cloud:
        nacos:
          discovery:
            # Nacos服务的地址
            server-addr: 192.168.126.32:8848
    
  7. 启动openfeign-order80项目后,在Nacos中的服务管理的服务列表中会出现该服务
    在这里插入图片描述

  8. 在浏览器上测试使用OpenFeign进行远程服务调用,输入:http://localhost/order/index
    此时返回payment success即调用成功

2.3 OpenFeign实现服务降级

  1. 在cloud-consumer-openfeign-order80的POM文件中,引入服务降级的依赖

    <!-- 引入服务降级依赖包 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  2. 在cloud-consumer-openfeign-order80的resources下的application.yml文件中,添加如下配置开启openfeign对sentinel的支持

    feign:
      sentinel:
        enabled: true
    
  3. 在cloud-provider-payment8001的PaymentController中添加如下超时方法

    @GetMapping("timeout")
    public String timeout(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "payment success";
    }
    
  4. 在cloud-consumer-openfeign-order80的OrderController中添加如下超时方法

    @GetMapping("timeout")
    public String timeout(){
        return iPaymentFeignService.timeout();
    }
    
  5. 在cloud-consumer-openfeign-order80的IPaymentFeignService中添加如下超时方法

    @GetMapping("/payment/timeout")
    String timeout();
    
  6. 在浏览器上测试使用OpenFeign进行远程服务调用,输入:http://localhost/order/timeout
    此时返回报500错误,控制台显示读取超时
    在这里插入图片描述

  7. 实现服务降级的回调方法

  1. 需要在cloud-consumer-openfeign-order80的IPaymentFeignService接口中指定服务降级回调类

    @FeignClient(value = "payment-provider",fallback = PaymentServiceFallback.class)
    

    2)在cloud-consumer-openfeign-order80的com.zzx.fallback包下,创建PaymentServiceFallback服务降级回调类

    package com.zzx.fallback;
    
    import com.zzx.service.IPaymentFeignService;
    import org.springframework.stereotype.Component;
    
    @Component
    public class PaymentServiceFallback implements IPaymentFeignService {
        @Override
        public String index() {
            return null;
        }
    
        /**
         * 服务降级方法
         * @return
         */
        @Override
        public String timeout() {
            return "系统繁忙,请稍后再试";
        }
    }
    
    
  1. 在浏览器访问:http://localhost/order/timeout
    此时会进行服务降级,回调服务降级类对应的方法
    在这里插入图片描述

3、远程服务调用Dubbo

3.1 创建接口服务工程cloud-service-api

  1. 在父工程下,右键创建子模块cloud-service-api
    在这里插入图片描述

  2. 创建一个公共支付接口

    package com.zzx.service;
    
    /**
     * 支付接口
     */
    public interface IPaymentService {
        String index();
    }
    

3.2 创建支付生产者工程cloud-dubbo-provider-payment8001

  1. 在父工程下,右键创建子模块cloud-dubbo-provider-payment8001
    在这里插入图片描述

  2. 在cloud-dubbo-provider-payment8001的POM文件中,添加如下依赖

    <dependencies>
        <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.zzx</groupId>
            <artifactId>cloud-service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
            <version>2021.0.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
    
  3. 在cloud-dubbo-provider-payment8001中创建主启动类PaymentDubboMain8001

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 主启动类
     */
    @SpringBootApplication
    @Slf4j
    @EnableDiscoveryClient
    public class PaymentDubboMain8001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentDubboMain8001.class,args);
            log.info("********** PaymentDubboMain8001 启动成功  ***********");
        }
    }
    
    
  4. 在cloud-dubbo-provider-payment8001的resources中,创建application.yml,添加如下配置

    server:
      port: 8001
    spring:
      main:
        allow-bean-definition-overriding: true
        allow-circular-references: true
      application:
        # 应用名
        name: payment-provider-dubbo
      cloud:
        nacos:
          discovery:
            # Nacos服务地址
            server-addr: 192.168.126.32:8848
    # dubbo配置
    dubbo:
      # dubbo 服务实现类扫描包
      scan:
        base-packages: com.zzx.service
      registry:
        # 注册地址
        address: nacos://192.168.126.32:8848
        timeout: 10000
      # Dubbo服务暴露协议的配置
      protocol:
        name: dubbo
        # port为协议端口,(-1表示自增端口,从20880开始)
        port: -1
    
  5. 在cloud-dubbo-provider-payment8001中,创建支付业务层PaymentServiceImpl

    package com.zzx.service.impl;
    
    import com.zzx.service.IPaymentService;
    import org.apache.dubbo.config.annotation.DubboService;
    import org.apache.dubbo.config.annotation.Method;
    
    /**
     * 支付业务层
     */
    //以下是只将index方法注册到dubbo中
    @DubboService(timeout = 5000,methods = {@Method(name="index",retries = 2)})
    public class PaymentServiceImpl implements IPaymentService {
        @Override
        public String index() {
            return "dubbo payment";
        }
    }
    
    
  6. 启动该服务后,查看该服务是否在Nacos中注册
    在这里插入图片描述

3.3创建消费者cloud-dubbo-consumer-order80

  1. 在父工程下,右键创建子模块cloud-dubbo-consumer-order80在这里插入图片描述

  2. 在cloud-dubbo-consumer-order80的POM文件中,添加如下依赖

    <dependencies>
        <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.zzx</groupId>
            <artifactId>cloud-service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
            <version>2021.0.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    
    </dependencies>
    
  3. 创建cloud-dubbo-consumer-order80的主启动类

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @Slf4j
    @EnableDiscoveryClient
    public class OrderDubboMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderDubboMain80.class,args);
            log.info("*******  OrderDubboMain80 启动成功  ******");
        }
    }
    
    
  4. 在cloud-dubbo-consumer-order80的resources中,创建application.yml配置文件,添加如下配置

    server:
      port: 80
    spring:
      main:
        allow-circular-references: true
        #在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
        allow-bean-definition-overriding: true
      application:
        #应用名字
        name: order-consumer-dubbo
      cloud:
        nacos:
          discovery:
            #Nacos地址
            server-addr: 192.168.126.32:8848
    
    
    #dubbo配置
    dubbo:
      cloud:
        #dubbo.cloud.subscribed-services:表示要订阅服务的服务名,可以配置'*',代表订阅所有服务,不推荐使用。若需订阅多应用,使用 "," 分割。
        subscribed-services: "*"
      registry:
        # 注册至Nacos
        address: nacos://192.168.126.32:8848
        # 超时时间
        timeout: 10000
      protocol:
        # 协议Dubbo
        name: dubbo
        # 端口号
        port: -1
      consumer:
        check: false
    
    
  5. 在cloud-dubbo-consumer-order80中创建订单业务层OrderService

    package com.zzx.service;
    
    import org.apache.dubbo.config.annotation.DubboReference;
    import org.springframework.stereotype.Service;
    
    /**
     * 订单业务层
     */
    @Service
    public class OrderService {
        //支付服务远程调用
        @DubboReference
        private IPaymentService iPaymentService;
    
        public String index(){
            return iPaymentService.index();
        }
    }
    
    
  6. 在cloud-dubbo-consumer-order80中创建订单控制层OrderController

    package com.zzx.controller;
    
    import com.zzx.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 订单控制层
     */
    @RestController
    @RequestMapping("/order")
    public class OrderController {
        @Autowired
        private OrderService orderService;
    
        /**
         * 测试Dubbo远程调用服务
         * @return
         */
        @GetMapping("/index")
        public String index(){
            return orderService.index();
        }
    }
    
    
  7. 启动该服务后,在浏览器访问:http://localhost/order/index
    在这里插入图片描述

3.4 Dubbo实现服务降级

  1. 在cloud-dubbo-provider-payment8001的PaymentServiceImpl实现类中,设置服务生产者集群容错模式cluster

    @DubboService(timeout = 5000,methods = {@Method(name="index",retries = 2)},cluster = "failfast")
    

    1)Failfast Cluster模式:这种模式称为快速失败模式,调用只执行一次,失败则立即报错。
    2)Failsafe Cluster模式:失败安全模式,如果调用失败, 则直接忽略失败的调用,而是要记录下失败的调用到日志文件。
    3)Failback Cluster模式:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
    4)Forking Cluster模式:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
    5)Broadcast Cluster模式:配置值为broadcast。广播调用所有提供者,逐个调用,任意一台报错则报错(2.1.0开始支持)。通常用于通知所有提供者更新缓存或日志等本地资源信息。

  2. 在cloud-dubbo-consumer-order80中,创建服务降级的回调类PaymentServiceFallback

    package com.zzx.service.fallback;
    
    import com.zzx.service.IPaymentService;
    
    /**
     * 支付服务降级处理
     */
    public class PaymentServiceFallback implements IPaymentService {
        @Override
        public String index() {
            return "服务繁忙,请稍后再试!";
        }
    }
    
    
  3. 在cloud-dubbo-consumer-order80的OrderService中,在DubboReference注解中添加一个mock指定回调类

    @DubboReference(mock = "com.zzx.service.fallback.PaymentServiceFallback")
    
  4. 先将dubbo的生产者跟消费者启动,然后关闭生产者,再访问:http://localhost/order/index
    在这里插入图片描述
    即配置了访问服务生产者失败后,立刻调用服务降级类的对应方法。

总结

  1. 在高并发场景下使用Dubbo,因为Dubbo长连接,如果不是高并发会浪费资源;低并发或者性能要求不高使用OpenFeign,因为OpenFeign不是长连接并且便于使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/50761.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Caffeine本地缓存技术

说明&#xff1a;Caffeine是本地缓存方案&#xff0c;在所有本地缓存中命中率最佳&#xff0c;参考下图&#xff08;引自http://t.csdn.cn/oiQlH&#xff09;&#xff0c;本文介绍Caffeine在SpringBoot项目中的应用。 使用 例如现在有两个接口&#xff0c;一个查询所有用户&am…

分析npm run serve之后发生了什么?

首先需要明白的是&#xff0c;当你在终端去运行 npm run ****&#xff0c;会是什么过程。 根据上图的一个流程&#xff0c;就可以衍生出很多问题。 1&#xff0c;为什么不直接运行vue-cli-service serve? 因为直接运行 vue-cli-service serve&#xff0c;会报错&#xff0c…

数字光源控制器报警说明

Revision Sheet: Rev Data Author Description 1.0 20230729 Shuangyi 数字光源控制器报警说明 V1.0 一.报警说明 当我们所连接的光源负载超出光源控制器本身驱动能力的时候&#xff0c;我们会对控制器进行保护&#xff0c;从以下方式可知道过流的情况&#xff0c;如…

【信号去噪】基于马氏距离和EDF统计(IEE-TSP)的基于小波的多元信号去噪方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数据可视化(2)

1.柱状图 #柱状图 #bar(x,height,width,*,aligncenter,**kwargs) #height柱子的高度&#xff0c;即y轴上的数据 #width数组的宽度&#xff0c;默认值0.8 #*表示后面的参数为匿名关键字&#xff0c;必须传入参数 #kwargs关键字参数x[1,2,3,4,5] height[random.randint(10,100)f…

【学习笔记】视频检测方法调研

目录 1 引言2 方法2.1 视频目标跟踪2.1.1 生成式模型方法2.1.2 判别式模型方法2.1.2.1 基于相关滤波跟踪2.1.2.2 基于深度学习跟踪 2.2 视频异常检测2.2.1 基于重构方法2.2.2 基于预测方法2.2.3 基于分类方法2.2.4 基于回归方法 2.3 深度伪造人脸视频检测2.3.1 基于RNN时空融合…

WIZnet W6100-EVB-Pico DHCP 配置教程(三)

前言 在上一章节中我们讲了网络信息配置&#xff0c;那些网络信息的配置都是用户手动的去配置的&#xff0c;为了能跟电脑处于同一网段&#xff0c;且电脑能成功ping通板子&#xff0c;我们不仅要注意子网掩码&#xff0c;对于IP地址主机位和网络位的划分&#xff0c;而且还要注…

【LeetCode】二叉树的前序,中序,后序遍历

此题用递归做比较容易&#xff0c;然后根据前中后的遍历特点&#xff1a; 前序是根左右&#xff0c; 中序是左根右&#xff0c; 后序是左右根。 前序遍历&#xff1a;做题入口 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer…

求分享如何批量压缩视频的容量的方法

视频内存过大&#xff0c;不但特别占内存&#xff0c;而且还会使手机电脑出现卡顿的现象&#xff0c;除此之外&#xff0c;如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此&#xff0c;我们可以批量地压缩视频文件的内存大小&#xff0c;今天小编要来分享一招&a…

VSCode配置之C++ SQLite3极简配置方案

背景 最近在学习《深入应用C11: 代码优化与工程级应用》&#xff0c;其中第13章说到SQLite库&#xff0c;查询网上诸多教程&#xff0c;发现比较容易出现bug且配置较为麻烦&#xff0c;故记录此次简化版方案&#xff0c;以供参考。 软件环境 SQLite 3.42.0 版本&#xff08;仅…

解读分布式锁(redis实现方案)

1.导读 分布式锁是一种用于分布式系统中的并发控制机制&#xff0c;它用于确保在多个节点或多个进程之间的并发操作中&#xff0c;某些关键资源或代码块只能被一个节点或进程同时访问。分布式锁的目的是避免多个节点同时修改共享资源而导致的数据不一致或冲突的问题。通俗的来…

【MySQL】索引与B+树

【MySQL】索引与B树 索引概念前导硬件软件方面 索引的理解单个page多个page引入B树B树的特征为什么B树做索引优于其他数据结构&#xff1f;聚簇索引与非聚簇索引辅助索引 索引的创建主键索引的创建和查看唯一键索引的创建和查看普通索引的创建和查看复合索引全文索引索引的其他…

【数据集】3小时尺度降水数据集-MSWEPV2

1 MSWEP V2 precipitation product 官网-MSWEP V2降水产品 参考

【Python数据分析】Python基本数据类型

&#x1f389;欢迎来到Python专栏~Python基本数据类型 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望…

基于WSL2、Ubuntu和VS Code的CUDA平台运行C语言程序

一、CUDA程序执行方法 执行步骤为&#xff1a; 安装Visual Studio Code。在Visual Studio Code中安装插件WSL与电脑的WSL2进行连接。点击左下角&#xff0c;然后再选择连接到WSL。 在WSL中创建以 .cu 为后缀的文件。 rootDESKTOP-HR6VO5J:~# mkdir CUDA /…

Flutter ios真机调试连接断开后应用闪退

使用ios真机调试的时候&#xff0c;能正常打开应用&#xff0c;但是当数据线断开连接的时候&#xff0c;应用就会关闭&#xff0c;重新打开就会闪退。 原因是flutter默认在开发过程中使用debug模式编译 只需要将debug选择为release 重新编译就行。

C++代码格式化工具clang-format详细介绍

文章目录 clang-format思考代码风格指南生成您的配置运行 clang-format禁用一段代码的格式设置clang-format的设置预览 clang-format 我曾在许多编程团队工作过&#xff0c;这些团队名义上都有“编程风格指南”。该指南经常被写下来并放置在开发人员很少查看的地方。几乎在每种…

Shell 排序法 - 改良的插入排序

说明 插入排序法由未排序的后半部前端取出一个值&#xff0c;插入已排序前半部的适当位置&#xff0c;概念简单但速度不快。 排序要加快的基本原则之一&#xff0c;是让后一次的排序进行时&#xff0c;尽量利用前一次排序后的结果&#xff0c;以加快排序的速度&#xff0c;Shel…

【软件测试】基于博客系统的自动化测试

目录 1.我的博客系统链接 2.使用selenium对博客系统进行自动化测试 1.引入依赖 2.创建公共类 3.创建测试套件类 4.测试登陆界面 5. 测试博客列表页 6.测试写博客页面 7.测试删除博客 8.最终运行结果 1.我的博客系统链接 用户登录 2.使用selenium对博客系统进行自动…

Git时间:版本控制工具进阶

Git时间&#xff1a;版本控制工具进阶 忽略文件 Git允许用户将指定的文件或目录排除在版本控制之外&#xff0c;它会检查代码仓库的目录下是否存在一个名为.gitignore的文件&#xff0c;如果存在&#xff0c;就去一行行读取这个文件中的内容&#xff0c;并把每一行指定的文件…