微服务---Spring Cloud Alibaba 02(Nacos)

Nacos介绍与使用 一背景分析 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。 市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google),那他们分别都有什么特点,我们如何进行选型呢?我们主要从社区活跃度,稳定性,功能,性能等方面进行考虑即可.本次微服. 阅读详情

上一篇讲解了一下他们之间的关系以及概念,这篇来具体实操一下

一、Nacos服务注册中的配置

1.概述:

        在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。
市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google)等,我们使用的Nacos

2.特点:

        Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。

3.安装使用:

3.1.下载解压
下载地址icon-default.png?t=L892https://github.com/alibaba/nacos/releases3.2数据库建立

        在conf文件下有nacos-mysql.sql脚本文件,在数据库里执行,这个sql脚本文件不完全,需要自己手动建立库在库下执行

数据库版本:要求mysql的版本大于5.7版本(MariaDB最好10.5.11)

3.3配置文件配置

        打开/conf/application.properties里打开默认配置,并基于你当前环境配置要连接的数据库,连接数据库时使用的用户名和密码(假如前面有"#"要将其去掉)

3.4启动测试

启动:standalone代表单机模式运行,非集群

Linux/Unix/Mac启动命令

./startup.sh -m standalone

Windows启动命令

startup.cmd -m standalone

前提:

  1. 执行执行令时要么配置环境变量,要么直接在nacos/bin目录下去执行.
  2. nacos启动时需要本地环境变量中配置了JAVA_HOME(对应jdk的安装目录),
  3. 一定要确保你连接的数据库(nacos_config)是存在的.

访问服务:

默认地址

http://localhost:8848/nacos

默认密码:nacso/nacos

在IDEA里添加脚本按钮启动:

 

二、项目的创建 

1.创建聚合父工程

结构:

 pom文件依赖的添加:

    <!--maven支持单继承,多层继承,所以需要导入的方式,只有pom才能导入-->
    <groupId>com.cy</groupId>
    <artifactId>01-sca</artifactId>
    <!--创建父工程的子工程时,父工程的打包方式会自动变为pom方式-->
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <!--创建子工程时辉自动将子工程的名字放到modules下-->
    <modules>
        <module>sca-provider</module>
        <module>sca-consumer</module>
        <module>sca-gateway</module>
    </modules>
    <!--properties中定义一些属性元素,动态的定义版本号,如下
        <version>${spring-boot-version}</version>-->
    <properties>
        <spring-boot-version>2.3.2.RELEASE</spring-boot-version>
    </properties>
    <!--maven的父工程为pom工程
    此工程主要负责依赖版本及部分基础依赖的管理-->
    <dependencyManagement>
        <!--spring boot 依赖-->
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-version}</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
            <!--Spring Cloud依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
            <!--Spring Cloud Alibaba 依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--下面这个dependencies元素中定义子工程都需要的依赖-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <!--编译阶段有效,运行阶段无效-->
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.创建子工程

概念:生产者与消费者都是相对来说的,没有绝对的消费者与生产者

2.1生产者服务创建注册

在父工程下创建子工程生产者服务sca-provider

2.1.1.pom依赖的添加

<!--工程模块坐标-->
    <artifactId>sca-provider</artifactId>
    <!--创建maven模块自带的,用于指定maven中对java类的编译和运行版本-->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--web 服务依赖-->
        <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>
        <!--nacos配置中心的依赖(nacos.io)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

2.1.2.创建并配置bootstrap.yml文件

server:  #创建生产者服务注册
  port: 8081 #服务端口
spring:
  application:
    name: sca-provider   #服务名
  cloud:
    nacos: #服务启动时会向nacos发送心跳包(5s一次)
      discovery: #服务的注册和发现
        server-addr: localhost:8848  #nacos server

2.1.3.创建启动类定义代码

@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

    /**定义Controller对象(这个对象在spring mvc中给他的定义是handler),
     * 基于此对象处理客户端的请求*/
    @RestController
    public class ProviderController{
        //@Value默认读取项目配置文件中配置的内容
        //8080为没有读到server.port的值时,给定的默认值
        @Value("${server.port:8080}")
        private String server;
        //Echo 回显
        //Rest 一种软件架构编码风格,可以基于这种风格定义url
        //http://localhost:8081/provider/echo/tedu
        @GetMapping("/provider/echo/{msg}")
        public String doRestEcho1(@PathVariable String msg){
            return server+":"+msg;
        }
    }
  }

2.1.4.查看服务

启动服务进入Naocs的服务列表进行查看,显示服务名则注册成功

 2.2消费者服务创建注册

前两步同消费者创建,注意端口号不要重复即可

2.2.1创建启动类定义代码

@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
    /*启动类启动时将RestTemplate IOC交给spring管理
    * 后续通过此对象进行远程调用*/
    //restTemplate 需要调用服务提供方的服务时添加,交由spring去管理
    @Bean//别忘了启动类注解@SpringBootApplication包含了配置类注解,它本身就时一个大的配置类
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    @RestController
    public class ConsumerController{

        @Value("${spring.application.name}")
        private String appName;
        @Autowired
        private RestTemplate restTemplate;
        @GetMapping("/consumer/doRestEcho1")
        public String doRestEcho01(){
        //调用服务方提供的API   url也是API
        //1.定义要调用的API
            String url = "http://localhost:8081/provider/echo/"+appName;
            System.out.println("request url:"+url);
        //2.谁去访问这个API
           return restTemplate.getForObject(url, String.class);
        }
    }
}

2.2.2查看服务

启动服务进入Naocs的服务列表进行查看,显示服务名则注册成功

 

问题:现在是服务调用的形式,一个服务实例可以处理请求是有限的,,那在某个高峰期其他服务全部都来调用一个服务服务器会有宕机的现象,我们又该如何处理呢?

3.负载均衡调用服务

3.1直接负载均衡调用服务

注入LoadBalancerClient类

        @Autowired
        private LoadBalancerClient loadBalancerClient;

通过注册中心获取服务实例来调用服务

    //负载均衡方式调用
    @GetMapping("consumer/doRestEcho2")
    public String doRestEcho2(){
        //1.层注册中心获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("sca-provider");
        //2.基于RestTemplate进行服务实例对象
        String ip = instance.getHost();
        int port = instance.getPort();
        String url=String.format("http://%s:%s/provider/echo/%s", ip,port,appName);
        return restTemplate.getForObject(url, String.class);
    }

 3.2测试

开启两个服务生产者服务,通过消费者对它进行访问并输出端口号

如图所示,真的实现了负载均衡 

 思考1:为什么调用注册中心获取的服务实例就可以实现负载均衡的效果?

答:这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。

思考2:经过了长时间的使用,我们发现当前的调用的前几步都是类似的,我们可不可以将它们进行封装直接调用就好了呢?

3.3简洁负载均衡调用服务

在启动类里再次添加RestTemplate的Bean,并添加注解@LoadBalanced

    @Bean
    @LoadBalanced
    public RestTemplate loadBalancerRestTemplate(){
        return new RestTemplate();
    }

进行注入

        @Autowired
        private RestTemplate loadBalancerRestTemplate;

直接通过服务名来调用服务

    @GetMapping("consumer/doRestEcho3")
    public String doRestEcho3(){
        //定义url
        //节省了注册中心获取服务实例和获取服务的ip和端口号这三步,直接写服务名称即可,记得要用加@LoadBalanced的注解的Bean调用
        String url=String.format("http://sca-provider/provider/echo/%s", appName);
        //服务调用
        return loadBalancerRestTemplate.getForObject(url, String.class );
    }

底层实现: 

        RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer,@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。

@LoadBalanced的作用:描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。

Ribbon:Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法

Ribbon负载均衡策略:默认是轮询策略,当系统提供的负载均衡策略不能满足我们需求时,我们还可以基于IRule接口自己定义策略.

3.4 Feign的远程服务调用--重点

概述:

        服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生。Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现

1. 在服务消费方添加依赖

        <!--open feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.在启动类上添加@EnableFeignClients注解

@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {…}

3.创建service包,定义Http请求API,基于此API借助OpenFeign访问远端服务

@FeignClient(name="sca-provider")//远程调用的服务名
public interface RemoteProviderService {
    @GetMapping("provider/echo/{msg}")//服务路径
    public abstract String echoMessage(@PathVariable("msg") String msg);
}

注意:注解@PathVariable必须加,因为jdk8后可以省略,但是Feign为了向前兼容是jdk5的版本

4.创建Controller包进行测试

@RestController
@RequestMapping("/consumer")
public class FeignConsumerController {
    @Autowired
    private RemoteProviderService remoteProviderService;
    /*执行远程服务调用*/
    /*browser->consumer->provider*/
    /*自带负载均衡*/
    @GetMapping("/echo/{msg}")
    public String doRestEcho(@PathVariable String msg)  {
        return remoteProviderService.echoMessage(msg);
    }
}

5.测试

 测试成功

4.Feign配置进阶实践

问题1:一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextId,服务启动就会失败,例如假如在服务消费方再添加一个如下接口,消费方启动时就会启动失败,

解决:此时我们需要为远程调用服务接口指定一个contextId,作为远程调用服务的唯一标识即可

@FeignClient(name="sca-provider",contextId = "remoteProviderService",)
public interface RemoteProviderService {
    @GetMapping("provider/echo/{msg}")
    public abstract String echoMessage(@PathVariable("msg") String msg);
}

问题2:当我们在进行远程服务调用时,假如调用的服务突然不可用了或者调用过程超时了,怎么办呢,作为开发者而言,我们不能把错误暴漏在用户面前,所以我们一般服务消费端会给出具体的容错方案

解决:

1.创建出现问题时解决方案的类,实现FallbackFactory接口并重写里面的create方法,在方法里给出解决方案,注意后面加泛型为Feign接口的名字

@Component
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {
    /*org.slf4j.Logger是java的日志规范,定义了一组接口,接口的实现又log4f,logback(快)*/
//    private static Logger log= LoggerFactory.getLogger(ProviderFallbackFactory.class);//门面设计模式,有Slf4j注解就不用写这句了
    @Override
    public RemoteProviderService create(Throwable throwable) {
        //方式一:
//        return new RemoteProviderService() {
//            @Override
//            public String echoMessage(String msg) {
//                /*服务调节*/
//                return "服务忙,稍等";
//            }
//        };
        //方式二:
        //借助了jdk8中的lambda表达式
//        return (msg)->{//lambda表达式(jdk中一个表达式)
//            return "服务忙,稍等";
//        };
        //方式三:
        return msg -> "服务忙,稍等";
    }
}

注意:方式一是原型,后两者是lambda的简写表达式

2.在Feign访问接口中应用FallbackFactory=出现问题时解决方案的类名

@FeignClient(name="sca-provider",contextId = "remoteProviderService",fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
    @GetMapping("provider/echo/{msg}")
    public abstract String echoMessage(@PathVariable("msg") String msg);

 3.在配置文件application.yml中添加如下配置,启动feign方式调用时的服务中断处理机制.

feign:  
  hystrix:
    enabled: true #默认值为false

4.测试

在服务生产方添加延时代码模拟访问出错并访问地址查看现象

 测试成功

总结

流程:

  1. 通过 @EnableFeignCleints 注解告诉springcloud,启动 Feign Starter 组件。
  2. Feign Starter 在项目启动过程中注册全局配置,扫描包下所由@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
  3. 接口被调用时被动态代理类逻辑拦截,将 @FeignClient 请求信息通过编码器生成 Request对象,基于此对象进行远程过程调用。
  4. 请求对象经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
  5. 通过 Client 携带 Request 调用远端服务返回请求响应。
  6. 通过解码器生成 Response 返回客户端,将信息流解析成为接口返回数据。

重点知识:

  1. 为什么使用feign?(基于Feign可以更加友好的实现服务调用,简化服务消费方对服务提供方方法的调用)。
  2. @FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
  3. Feign方式的调用,底层负载均衡是如何实现的?(Ribbon)
  4. @EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)
如何使用公网地址远程访问内网Nacos UI界面查看注册服务 上面在本地Docker中成功部署了Nacos服务,并局域网访问成功,下面我们在Linux安装Cpolar内网穿透工具,通过cpolar 转发本地端口映射的http公网地址,我们可以很容易实现远程访问,而无需自己注册域名购买云服务器.下面是安装cpolar步骤。这种随机地址的优势在于建立速度快,可以立即使用。资源路径,在任意设备的浏览器进行访问,即可成功看到我们Nacos UI界面,这样一个公网地址且可以远程访问就创建好了,使用了Cpolar的公网域名,无需自己购买云服务器,即可发布到公网进行远程访问! 阅读详情

相关推荐

解决:Nacos 2.x版本的spring.cloud.nacos.server-addr不生效问题,以及nacos地址一直为localhost:8848问题

解决:Nacos 2.x版本的spring.cloud.nacos.server-addr不生效问题,以及nacos地址一直为localhost:8848问题[Request nacos server failed][Client not connected,current status:STARTING]

睡竹的博客 5万+

Nacos

Spring Cloud 之 Nacos 服务注册中心和配置中心

weixin_46061449的博客 1万+

Spring Cloud Alibaba入门教程-02【 Alibaba微服务组件Nacos注册中心】

官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。集 注册中心+配置中心+服务管理 平台Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 服务及其元数据管理管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题; Nacos Discovery 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址

tulingxueyuanXM的博客 6222

Nacos使用

nacos的使用

lz13419607299的博客 7776

基于jdk17,mysql8,redis7,spring boot3,spring cloud Alibaba ,nacos,openfigen,resilience4j等搭建的微服务框架

本篇文章基于jdk17,mysql8,redis7,spring boot3,spring cloud Alibaba > 2023.0.1,nacos,openfigen,resilience4j,LoadBalance,gateway搭建的微服务框架,本章不会又太多的废话,直接上干活

小电玩 1455

【微服务项目】Spring Cloud Alibaba 实战

Spring Cloud Alibaba 实战

技术专家 2017

Nacos - 构建 Spring Cloud Alibaba 服务发现体系

本文介绍了如何利用Spring Cloud Alibaba和Nacos构建微服务发现体系。主要内容包括:Spring Cloud Alibaba生态概述,Nacos作为服务注册中心和配置中心的双重角色;环境准备与Nacos Server部署指南;服务提供者(Provider)的配置实现,包含YAML配置示例和REST接口开发;服务消费者(Consumer)通过OpenFeign实现服务调用;以及Nacos配置中心的使用方法。文章通过架构图、代码示例和配置说明,详细讲解了从环境搭建到服务注册发现的完整流程,为

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Spring Cloud Alibaba 整合Nacos实战

Spring Cloud Alibaba 整合Nacos

congge_study的博客 7898

【Spring Cloud Alibaba】Nacos(一)

在Spring Cloud Alibaba套件中服务治理方面的核心组件是Nacos(Dynamic Naming and Configuration Service),在Spring Cloud Alibaba套件为基础的微服务中,Nacos担当的角色有服务发现和健康检测、服务注册中心(动态注册)、配置中心(动态配置)、服务元数据管理等功能。做为注册中心:Nacos管理所有的微服务,解决微服务调用之间的错综复杂、难以维护的问题。

Blue_Pepsi_Cola的博客 1696

【springcloud 微服务】Spring Cloud Alibaba Nacos使用详解

nacos使用详细总结

congge_study的博客 6751

云原生微服务实战 Spring Cloud Alibaba 之 Nacos

云原生微服务治理有很多手段,但在Java生态里,最主流的还是Spring Cloud Alibaba 、Spring Cloud Netflix。 Spring Cloud文章的前部分已经把Spring Cloud Netflix相关组件讲解且实践过了,这章我们讲解了Spring Cloud Alibaba的Nacos discovery,后续还会继续讲解完Spring Cloud Alibaba其他组件。

Java 技术专栏,从入门到精通,熟悉企业级开发 3万+

Spring Cloud Alibaba Nacos(功能篇)

本文以微服务为趋势代表,以云原生为时代背景,对NACOS作了纲领性的介绍,将NACOS的功能全方位展现在你的面前,阅读后,你会对NACOS有一个更全面的认识。

文刀的博客天地 1万+

Spring Cloud Alibaba【什么是Nacos、Nacos Server下载安装 、Docker安装Nacos Server服务、微服务聚合父工程构建】(一)

Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开 发者提供一款便捷、简单上手的开源框架。为什么Nacos这么受欢迎Nacos官方文档的介绍中有这么一句话,如下:Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范 式、云原生范式) 的服务基础设施。这两个组件相信大家都用过,有什么感受?

1万+

Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

weixin_46619605的博客 1844

Spring Cloud Alibaba系列教程——Spring Cloud Alibaba开篇

随着Spring Cloud Alibaba的发展,Spring Cloud Alibaba的相关组件逐渐的成熟,对于它的学习和研究已经是java开发人员的趋势。这篇博文主要内容是介绍什么是Spring Cloud Alibaba,Spring Cloud 与Spring Cloud Alibaba的关系,以及我们为什么要学习它,以及畅想Spring Cloud Alibaba未来发展。

努力+坚持,而且还很年轻 6655

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南

本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。

gpu4optimizer的博客 868

SpringCloud Alibaba 2021版 nacos 配置中心教程

文章目录nacos 配置中心 是什么nacos config 和 springcloud config 对比常用配置中心对比支持profile粒度的配置快速入门 nacos 配置中心 是什么 nacos config 和 springcloud config 对比 springcloud config大部分场景结合git 使用, 动态变更还需要依赖Spring Cloud Bus 消息总线来通过所有的客户端变化. springcloud config不提供可视化界面 nacos config使用长轮询更新

做一个有思想的技术人 1万+

ORB-SLAM3单目摄像头

home/wheeltec-client/workspace/src/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅话题(usb_cam/imahe_raw)即相机设置文件,官方提供的是Asus.yaml,可以另复制命名一个文件My_camera.yaml,将里面的相机参数修改成自己标定过的参数。sudoaptinstalllibeieng3-dev#命令安装的版本是eigen。

疯狂的石头 742

使用spring cloud alibaba搭建微服务

公共配置,如nacos服务发现地址spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848,数据库连接等。如服务器名称、nacos配置中心地址spring.cloud.nacos.config.serveraddr=127.0.0.1:8848,需要引入的配置文件。如订单服务,在application.yml文件中配置必要内容,配置了这些内容才能通过找到配置中心的相应文件。-- nacos-config 配置中心依赖 -->

jadewoo8888的博客 2542

RK3568平台(USB篇)USB Gadget 驱动

USB 设备驱动,按照设备端关联的 USB 控制器 是工作在 主模式 还是 从模式,分为 USB 设备主机侧驱动 (主模式),或者 USB 设备从机侧驱动 (从模式)。同时,工作在 主模式 的 USB 控制器,称为 USB 主机控制器 (UHC: USB Host Controller),工作在 从模式 的 USB 控制器,称为 USB 设备控制器 (UDC: USB Device Controller)。有的 USB 控制器,只能工作在 主模式 或 从模式 中的某一种;

weixin_49303682的博客 1439

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

spring-cloud-alibaba-nacos-discovery使用说明

Nacos-Client 作为微服务架构中连接 Nacos 服务端的核心组件,其版本选择需与上下游组件严格匹配,以确保功能稳定性和兼容性。:需与 Spring Boot 和 Spring Cloud 版本匹配(如 Spring Boot 2.7.x + Spring Cloud 2021.0.x)。的核心组件,通过与 Nacos Server 的深度集成,帮助开发者快速构建动态服务治理体系。通过以上版本匹配策略,可有效规避兼容性问题,确保服务注册、配置管理等核心功能的稳定性。调用时直接使用服务名(

技术人集结地 4054

2025年数学建模国赛高教社杯A题、B题、C题、D题、E题详细思路和代码 模型||插值与拟合

核心思想:构造一个精确通过所有已知离散数据点(xi, yi)的函数y = f(x),并以此函数来估算或预测未知点的值。基本假设:我们认为已知的数据点是100%精确、无误差的(或者误差可忽略不计),比如理论计算值、高精度仪器测量值等。我们的目标是“还原”或“重建”出点与点之间的真实函数关系。关键特征精确性:曲线或曲面必须穿过每一个样本点。局部性:插值结果严重依赖于局部数据点的分布和数值。用途:用于“补全”数据、填充缺失值、进行函数近似等。常见方法多项式插值:拉格朗日插值、牛顿插值。

2201_76125261的博客 802
上一篇: 微服务---Spring Cloud Alibaba 01
下一篇: 微服务---Spring Cloud Alibaba 03(配置中心)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值