SpringCloud Alibaba Nacos

news2024/7/6 21:12:28

SpringCloud Alibaba Nacos

Nacos 基础

1 官网

1.1 https://github.com/alibaba/Nacos

2 Nacos 是什么?

2.1 一句话: Nacos 就是注册中心[替代Eureka]+配置中心[替代Config]
2.2 Nacos:Dynamic Naming and Configuration Service
2.3 Nacos:架构理论基础: CAP 理论(支持AP 和CP, 可以切换)

3 Nacos 下载&运行

3.1 下载: https://github.com/alibaba/nacos/releases/tag/1.2.1
3.2 环境要求: Java8/Maven 3.2.x+
3.3 解压,运行bin/startup.cmd
3.4 浏览器http://localhost:8848/nacos
3.5 用户名/密码为nacos

  1. 输入: localhost:8848/nacos

image.png

image.png

创建Nacos 服务提供者

– 示意图

image.png

创建member-service-nacos-provider-10004 并注册到NacosServer8848

  1. 参考member-service-provider-10000 来创建member-service-nacos-provider-10004 即可
  2. 创建好后, 使用member-service-provider-10000 的源码和配置替换member-service-nacos-provider-10004 生成的代码
  3. 提醒,拷贝时不要忘记拷贝resources/mapper/MemberMapper.xml 这些xxx.xml 文件

修改父项目pom.xml

  1. 参考官方文档
    https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

image.png

修改pom.xml, 加入spring-cloud-alibaba 依赖

<!--引入相关的依赖-->
    <dependencies>
       <!--引入nacos-starter nacos的场景启动器starter -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <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>

        <!--引入mybatis-starter 整合到springboot-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <!--引入druid-starter-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!--这里需要我们指定版本, 因为父项目没有-->
            <version>1.1.17</version>
        </dependency>

        <!--引入mysql依赖,使用版本仲裁-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--spring-boot-start-jdbc引入-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--引入test-starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--引入公共模块-->
        <dependency>
            <groupId>com.hspedu.springcloud</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

创建application.yml

将member-service-provider-10000 的application.xml 拷贝过来,修改即可

server:
  port: 10004

spring:
  application:
    name: member-service-nacos-provider #配置应用的名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 自己的密码
  #配置nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos Server的地址
#配置暴露所有的监控点
management:
  endpoints:
    web:
      exposure:
        include: '*'
mybatis:
  mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
  type-aliases-package: com.wyxedu.springcloud.entity # 实例类所在的包,这样通过类名就可以引用

创建主启动类

//@EnableDiscoveryClient 引入的是Nacos发现注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10004 {
    public static void main(String[] args) {
        SpringApplication.run(MemberNacosProviderApplication10004.class, args);
        System.out.println();
    }
}

为看到更好提示,修改Controller

说明

1. 我们的前端如果是以json格式来发送添加信息Member, 那么我们需要使用@RequestBody, 才能将数据封装到对应的bean, 同时保证http的请求头的 content-type是对应
2. 如果前端是以表单形式提交了,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证http的请求头的 content-type是对应

@RestController
@Slf4j
public class MemberController {
    @Resource
    private MemberService memberService;
    @PostMapping(value = "/member/save")
    public Result save(@RequestBody Member member) {//增加
        log.info("会员服务方接收到member= " + member);
        int result = memberService.save(member);
        log.info("reset= " + result);
        if (result > 0) { //成功
            return Result.success(" 添加用户成功 member-service-nacos-provider-10004", result);
        } else {
            return Result.error("401", "添加用户失败");
        }
    }
    //这里使用url占位符+@PathVariable
    @GetMapping(value = "/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        Member member = memberService.queryMemberById(id);
        log.info("查询结果= " + member);
        if (member != null) {
            return Result.success(" 查询成功member-service-nacos-provider-10004",
                    member);
        } else {
            return Result.error("402", "ID= " + id + " 不存在");
        }
    }
}

测试

1 启动Nacos Server 8848
2 启动member-service-nacos-provider-10004
3 观察nacos 服务是否注册成功

image.png

浏览器: http://localhost:10004/member/get/1

image.png

创建member-service-nacos-provider-10006 并注册到NacosServer8848

创建member-service-nacos-provider-10006

  1. 参考member-service-nacos-provider-10004 来创建member-service-nacos-provider-10006 即可
  2. 创建好后, 使用member-service-nacos-provider-10004 的源码和配置替换member-service-nacos-provider-10006 生成的代码
  3. 提醒,拷贝时不要忘记拷贝resources/mapper/MemberMapper.xml 这些xxx.xml 文件

修改本模块pom.xml

   <dependencies>

        <!--引入nacos-starter nacos的场景启动器starter -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <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>

        <!--引入mybatis-starter 整合到springboot-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <!--引入druid-starter-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!--这里需要我们指定版本, 因为父项目没有-->
            <version>1.1.17</version>
        </dependency>

        <!--引入mysql依赖,使用版本仲裁-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--spring-boot-start-jdbc引入-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--引入test-starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--引入公共模块-->
        <dependency>
            <groupId>com.hspedu.springcloud</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

创建application.yml

server:
  port: 10006

spring:
  application:
    name: member-service-nacos-provider #配置应用的名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 自己的密码
  #配置nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos Server的地址
#配置暴露所有的监控点
management:
  endpoints:
    web:
      exposure:
        include: '*'
#配置mybatis
mybatis:
  mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
  type-aliases-package: com.hspedu.springcloud.entity # 实例类所在的包,这样通过类名就可以引用

创建主启动类

//@EnableDiscoveryClient 引入的是Nacos发现注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10006 {
    public static void main(String[] args) {
        SpringApplication.run(MemberNacosProviderApplication10006.class,args);
    }
}

为看到更好提示,修改Controller

说明

1. 我们的前端如果是以json格式来发送添加信息Member, 那么我们需要使用@RequestBody, 才能将数据封装到对应的bean, 同时保证http的请求头的 content-type是对应
2. 如果前端是以表单形式提交了,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证http的请求头的 content-type是对应

@RestController
@Slf4j
public class MemberController {
    @Resource
    private MemberService memberService;
    @PostMapping(value = "/member/save")
    public Result save(@RequestBody Member member) {//增加
        log.info("会员服务方接收到member= " + member);
        int result = memberService.save(member);
        log.info("reset= " + result);
        if (result > 0) { //成功
            return Result.success(" 添加用户成功 member-service-nacos-provider-10004", result);
        } else {
            return Result.error("401", "添加用户失败");
        }
    }
    //这里使用url占位符+@PathVariable
    @GetMapping(value = "/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        Member member = memberService.queryMemberById(id);
        log.info("查询结果= " + member);
        if (member != null) {
            return Result.success(" 查询成功member-service-nacos-provider-10004",
                    member);
        } else {
            return Result.error("402", "ID= " + id + " 不存在");
        }
    }
}

测试

1 启动Nacos Server 8848
2 启动member-service-nacos-provider-10006
3 观察nacos 服务是否注册成功

image.png
浏览器: http://localhost:10006/member/get/1

image.png

创建Nacos 的服务消费者

– 示意图

image.png

创建member-service-nacos-consumer-80 并注册到NacosServer8848

  1. 参考member-service-consumer-80 来创建member-service-nacos-consumer-80 即可修改pom.xml

  2. 将member-service-consumer-80 的pom.xml 的… 拷贝过来,修改即可增加这个包

    <!--引入alibaba-nacos 使用版本仲裁-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

创建application.yml

server:
  port: 80

spring:
  application:
    name: member-service-nacos-consumer-80
  #配置nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos server的地址

创建主启动类/MemberNacosConsumerApplication80.java

@SpringBootApplication
@EnableDiscoveryClient //引入的是启动 nacos发现注解
@EnableFeignClients
public class MemberNacosConsumerApplication80 {
    public static void main(String[] args) {

        SpringApplication.run(MemberNacosConsumerApplication80.class,args);
    }
}

创建配置类config/CustomizationBean.java

/**

 * CustomizationBean: 配置类
 * 配置注入RestTemplate bean/对象
 */
@Configuration
public class CustomizationBean {

    //说明: 配置注入RestTemplate bean/对象
    //这里的@LoadBalanced 就是赋予 RestTemplate 负载均衡的能力
    //默认是使用轮询算法来访问远程调用接口/地址
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

创建/MemberNacosConsumerController.java

@RestController
@Slf4j
public class MemberNacosConsumerController {

    //说明 http://member-service-nacos-provider 就是服务注册到Nacos server的服务名,注意这里是小写
    public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL =
            "http://member-service-nacos-provider"; //老师分析一下这里?应该这么填写

    //配置RestTemplate
    @Resource
    private RestTemplate restTemplate;

   //方法1/接口. 添加member
    @PostMapping("/member/nacos/consumer/save")
    public Result<Member> save(Member member) {

        return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL
                + "/member/save", member, Result.class);
    }

    //方法2/接口, 查询member
    @GetMapping("/member/nacos/consumer/get/{id}")
    public Result<Member> getMemberById(@PathVariable("id") Long id) {

        return restTemplate.getForObject(
                MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/get/" + id, Result.class);
    }
}

测试

1 启动Nacos Server 8848
2 启动member-service-nacos-provider-10004/10006
3 启动member-service-nacos-consumer-80
4 浏览器: http://localhost/member/nacos/consumer/get/1

image.png

image.png

配置自己的负载均衡算法, 测试完毕恢复成原来的轮询算法

/**
* RibbonRule: 配置类: 配置注入自己的负载均衡算法
*/
@Configuration
public class RibbonRule {

   @Bean
   public IRule myRibbtonRule() {
       //这里返回的是RandomRule, 小伙伴也可以自己指定
       return new RandomRule();
   }
}

Nacos AP 和CP 切换-理论

各种注册中心对比

image.png

选择AP 还是CP?

  1. CP: 服务可以不能用,但必须要保证数据的一致性。

  2. AP: 数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。

  3. 取舍:只能在CP 和AP 选择一个平衡点, 大多数都是选择AP 模式

AP 和CP 切换

说明

​ Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则(一般不切换)

CURL切换命令: curl -X PUT
​ ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’

URL指令:
​ $NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP

参考: https://www.jianshu.com/p/c56e22c222bb

Nacos 配置中心实例

示意图

image.png

在Nacos Server 加入配置

  1. 进入到Nacos Server
  2. 加入配置, 特别提醒: 文件后缀.yaml 别忘了.

image.png

Data ID: e-commerce-nacos-config-client-dev.yaml

image.png

image.png

创建Nacos 配置客户端模块e-commerce-nacos-config-client5000

创建Module

先创建e-commerce-nacos-config-client5000 模块,参考以前的方法

修改pom.xml

    <!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整-->
    <dependencies>

        <!--加入nacos-config stater  即场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--引入alibaba-nacos 使用版本仲裁-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--引入web-starter 老师说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <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>


        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--引入e_commerce_center-common-api-->
        <dependency>
            <groupId>com.hspedu.springcloud</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

创建application.xml

spring:
  profiles:
    active: dev #指定环境,常见的环境有 dev开发/test测试/prod生产

创建bootstrap.yml

  1. nacos 配置客户端/当前的微服务模块, 会根据配置,找到配置中心的数据(配置文件)

  2. config.server-addr: localhost:8848 可以找到配置中心

  3. spring.application.name 对应是DataId e-commerce-nacos-config

  4. 在application.yml: 配置 spring.profiles.active dev

  5. spring.cloud.nacos.config.file-extension 配置文件的扩展名 .yaml

  6. 小结: 根据配置 就是 到 localhost:8848 下的 e-commerce-nacos-config-dev.yaml 获取配置信息/数据

  7. 规则就是: s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}来定位配置中心的 Data ID

server:
  port: 20000 #端口

spring:
  application:
    #这里的name需要参考nacos 配置中心的Data Id
    name: e-commerce-nacos-config-client
  #配置nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置

创建主启动类NacosConfigClientApplication5000

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientApplication5000 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientApplication5000.class, args);
    }
}

业务类创建NacosConfigClientController

@RestController
@Slf4j
@RefreshScope //spring cloud原生注解,实现了配置数据的自动刷新
public class NacosConfigClientController {

    /**
     * 1. client 会拉取nacos server 的 e-commerce-nacos-config-client-dev.yaml
     * config:
     *     ip: "122.22.22.22"
     *     name: "大家好"
     * 2. @Value("${config.ip}") 会将 config.ip 赋给  configIp
     * 3. 这里${config.ip} 不能乱写,要有依据
     */
    @Value("${config.ip}")
    private String configIp;

    @Value("${config.name}")
    private String configName;

    @GetMapping("/nacos/config/ip")
    public String getConfigIp() {
        return configIp;
    }
    @GetMapping("/nacos/config/name")
    public String getConfigName() {
        return configName;
    }
}

测试

1 启动Nacos Server
2 启动e-commerce-nacos-config-client5000
3 浏览器: http://localhost:5000/nacos/config/ip

image.png

注意事项和细节

  1. NacosConfigClientController.java 的@Value(“${config.ip}”), 是import org.springframework.beans.factory.annotation.Value;而不是lombok 包下的.

  2. 配置文件application.yml 和bootstrap.yml 结合会得到配置文件/资源的地址

  3. 参考文档: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

image.png

  1. 注意在Nacos Server 的配置文件的后缀是.yaml , 而不是.yml

  2. 在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动, 也就是说如果项目不能正确的获取到Nacos Server 的配置数据,项目是启动不了的.

  3. springboot 中配置文件的加载是存在优先级顺序的, bootstrap.yml 优先级高于application.yml

  4. @RefreshScope 是springcloud 原生注解,实现配置信息自动刷新, 如果在Nacos Server 修改了配置数据,Client 端就会得到最新配置[演示]

Nacos 分类配置(实现配置隔离)

DataID 方案

示意图

image.png

解决方案分析

使用Data ID 方案解决

配置实现

  1. 在nacos server 创建新的配置:e-commerce-nacos-config-client-test.yaml

image.png

image.png

image.png

修改application.yml

spring:
  profiles:
    active: text #指定环境,常见的环境有 dev开发/test测试/prod生产

测试

浏览器输入: http://localhost:5000/nacos/config/ip

image.png

Group 方案

需求分析/图解

image.png

配置实现

  1. 在nacos server 创建新的配置:order/e-commerce-nacos-config-client-dev.yaml

image.png

image.png

image.png

  1. 在nacos server 创建新的配置:seckill/e-commerce-nacos-config-client-dev.yaml

image.png

image.png

修改application.yml

spring:
  profiles:
    active: dev #指定环境,常见的环境有 dev开发/test测试/prod生产

修改bootstrap.yml

  1. 增加group 参数
server:
  port: 20000 #端口

spring:
  application:
    #这里的name需要参考nacos 配置中心的Data Id
    name: e-commerce-nacos-config-client
  #配置nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: search #指定search组,默认是DEFAULT_GROUP

测试

1 浏览器: http://localhost:5000/nacos/config/ip

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e5gC26jp-1685059933336)(<转存失败,建议直接上传图片文件 …/%E5%9B%BE%E7%89%87/image-20230526074910029.png>)]

image.png

Namespace 方案

示意图

image.png

解决方案分析

1. 在nacos server 创建新的namespace , baidu 和alibaba

image.png

image.png

image.png

image.png

2. 在nacos server 创建新的group/dataid

image.png

image.png

image.png

修改application.yml

spring:
  profiles:
    active: dev #指定环境,常见的环境有 dev开发/test测试/prod生产

修改bootstrap.yml

增加Namespace 参数

server:
  port: 20000 #端口

spring:
  application:
    #这里的name需要参考nacos 配置中心的Data Id
    name: e-commerce-nacos-config-client
  #配置nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: search #指定search组,默认是DEFAULT_GROUP
        namespace: e37564de-2e0a-4f79-96e9-23ac35b90936  #指定对应namespace id[阿里]

测试

浏览器输入: http://localhost:5000/nacos/config/ip

image.png

Namespace/Group/Data ID 关系

image.png

详解介绍

Nacos默认的命名空间是public,Namespace主要用来实现配置隔离, 隔离范围大
Group默认是DEFAULT GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务, 相同的Service可以是一个Cluster(簇/集群), Instance 就是微服务的实例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构---二叉树(C语言)

二叉树 1. 二叉树1.1 二叉树的遍历1.1.1二叉树前中后序遍历&#xff08;递归版&#xff09;1.1.2 层序遍历 1.2 二叉树的其他相关接口1.2.1 求二叉树的结点数量1.2.2 求叶子结点个数1.2.3 求树高1.2.4 求第k层结点个数1.2.5 查找二叉树值为k的结点 1. 二叉树 空树非空&#xff…

跨境DNS解析失败问题解决

新钛云服已累计为您分享748篇技术干货 问题 公司使⽤的是阿⾥云基础设施&#xff0c;DNS解析使⽤的是境外的Akamai作为域名的DNS解析服务商。 当前有部分应⽤需要被第三⽅应⽤调⽤&#xff0c;同时也有主动调⽤第三⽅应⽤的需求。最近突发了很多调⽤失败问题。 应⽤调⽤失败&am…

YB时代,正寻找新的数据支点

每个人可能都想过这样一些问题&#xff1a;我们的地球&#xff0c;能够承载多少人口&#xff1f;地球上的石油和煤炭能用多久&#xff1f;碳排放的极限在哪里&#xff1f; 但你有没有想过&#xff0c;我们的地球&#xff0c;能够承载多少数据&#xff1f; 根据《数据存储2030白…

手把手教你打造自己的 AI 虚拟主播

零、写在前面一、 准备环境二、配置软件环境2.1 OBS 安装2.2. VTube Studio 安装 三、开启 B 站直播四、开启 AI 主播五、直播最终效果 零、写在前面 AI 直播在近年来得到了快速的发展和普及&#xff0c;它已经成为了直播平台的重要组成部分。目前&#xff0c;许多知名的直播平…

「读书感悟系列」生命的礼物 · 关于爱、死亡及存在的意义

作者 | gongyouliu 编辑 | gongyouliu 最近花了不到一周时间看完了著名的团体心理治疗大师欧文D.亚隆和他的妻子玛丽莲亚隆合著的这本『生命的礼物 关于爱、死亡及存在的意义』。这本书非常特别&#xff0c;这是玛丽莲在87岁得癌症后跟丈夫一起合作的&#xff0c;每人写一章&a…

URLConnection(二)

文章目录 1. 缓存2. Java的Web缓存 1. 缓存 Web浏览器会缓存页面和图片&#xff0c;将资源缓存在本地&#xff0c;每次需要时会从缓存中重新加载&#xff0c;而不是每次都请求远程服务器。一些HTTP首部&#xff08;包括Expires和Cache-Control&#xff09;可以控制首部。默认情…

OJ练习第116题——二进制矩阵中的最短路径(BFS)

二进制矩阵中的最短路径 力扣链接&#xff1a;1091. 二进制矩阵中的最短路径 题目描述 给你一个 n x n 的二进制矩阵 grid 中&#xff0c;返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径&#xff0c;返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格&am…

记一次Redis消息订阅序列化和反序列化的错误

1、使用的SpringBoot&#xff1b; 2、Redis的Config配置了JSON序列化&#xff0c;覆盖JDK序列化&#xff0c;便于中文查看&#xff0c;配置文件使用ConditionalOnProperty断言&#xff1b; 3、Nacos动态配置&#xff1b; 解决思路&#xff1a; 1、查看Redis中存入的数据乱码&am…

最佳WP Grid Builder评测:灵活的网格和过滤器

当您坐下来观看足球比赛时&#xff0c;您从一英里外都很容易看到超级巨星。 时尚而精致的比赛让他们与众不同&#xff0c;并且比赛的结果经常改变。球迷和经理们都喜欢他们&#xff0c;因为当他们踢球时&#xff0c;他们处于绝对最佳状态。 这同样适用于音乐界的巨星。通常&a…

Go中的异常处理(基础)

Go 中异常处理 主要掌握 一下几个方面: 掌握error接口掌握defer延迟掌握panic及recover error接口 error是指程序中出现不正常的情况,从而导致程序无法正常运行; go中为错误的类型提供了简单的错误处理机制 go中error的源码: // The error built-in interface type is t…

舵机云台实现追踪球形目标功能

1. 功能说明 在样机舵机云台上安装一个摄像头&#xff0c;本文示例将实现舵机云台追踪球形物体的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展板 Bi…

Linux之创建进程、查看进程、进程的状态以及进程的优先级

文章目录 前言一、初识fork1.演示2.介绍3.将子进程与父进程执行的任务分离4.多进程并行 二、进程的状态1.进程的状态都有哪些&#xff1f;2.查看进程的状态2.运行&#xff08;R&#xff09;3.阻塞4.僵尸进程&#xff08;Z&#xff09;1.僵尸状态概念2.为什么要有僵尸状态&#…

Rust每日一练(Leetday0011) 下一排列、有效括号、搜索旋转数组

目录 31. 下一个排列 Next Permutation &#x1f31f;&#x1f31f; 32. 最长有效括号 Longest Valid Parentheses &#x1f31f;&#x1f31f;&#x1f31f; 33. 搜索旋转排序数组 Search-in-rotated-sorted-array &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷…

开发 Microsoft 365 Copilot Plugin!

大家好&#xff01;我是韩老师。 昨天凌晨的微软 Build 大会&#xff0c;大家都看了吗&#xff1f; 我看到了凌晨两点&#xff0c;且毫无困意&#xff01; 真的是干货满满~ 列举几个比较大的发布&#xff1a;1. Windows Copilot2. Bing 成为 ChatGPT 的默认搜索体验3. AI 插件生…

一起看 I/O | 移动设备、Web、AI 和 Google Cloud 更新一览

作者 / Developer X 副总裁兼总经理、开发者关系主管 Jeanine Banks 感谢您再次与我们共享 Google I/O 大会的精彩&#xff01;我们正在持续深度投入资源来提升 AI、移动设备、Web 和 Google Cloud&#xff0c;致力于让您的开发工作更加轻松。现在&#xff0c;您看到了许多我们…

实测「360智脑」的真正实力:能否领跑国内百“模”大战?

ChatGPT 的发布&#xff0c;无疑掀起了一股“AI 技术”新浪潮。百度文心一言、华为盘古、商汤日日新、阿里通义千问、讯飞星火等众多大模型的接连问世&#xff0c;使得国内的“百模之战”进入了前所未有的白热化阶段。无论是各大互联网巨头&#xff0c;还是清华、复旦等知名高校…

聊聊「短信」渠道的设计与实现

有多久&#xff0c;没有发过短信了&#xff1f; 一、背景简介 在常规的分布式架构下&#xff0c;「消息中心」的服务里通常会集成「短信」的渠道&#xff0c;作为信息触达的重要手段&#xff0c;其他常用的手段还包括&#xff1a;「某微」、「某钉」、「邮件」等方式&#xff…

多种群遗传算法的函数优化算法

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1 理论基础 1.1 遗传算法早熟问题 遗传算法是一种借鉴生物界自然选择和进化机制发展起来的高度并行、随机、自适应的全局优化概率搜索算法。由于优化时不依赖于梯度&#xff0c;具有很强…

拥抱新时代的Java

原文链接 拥抱新时代的Java Java作为面向对象编程的王牌语言&#xff0c;曾经风靡一时&#xff0c;在Web领域是绝对的老大。随着时间的推移&#xff0c;一些新的编程范式不断的涌现&#xff0c;如函数式编程&#xff0c;响应式编程&#xff0c;以及对函数的全力支持&#xff0…

北邮22信通:实验五 共射放大电路的频率特性与深负反馈的影响

北邮22信通一枚~ 很高兴以一个新身份与大家见面~ 关注作者&#xff0c;解锁更多邮苑模电实验报告~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 目录 实验目的&#xff1a; 实验设备及器件&#xff1a; …