微服务注册中心

目录

一、微服务的注册中心

1、注册中心的主要作用

(1)服务发现

(2)服务配置

(3)服务健康检测

2、 常见的注册中心

二、nacos简介

1、nacos实战入门

(1)搭建nacos环境

(2)将商品/订单等微服务注册到nacos

三、服务调用Ribbon入门

1、Ribbon概述

(1)什么是Ribbon

(2)Ribbon的主要作用

2、基于Ribbon实现订单调用商品服务

(1)坐标依赖

(2)具体实现

四、服务调用Ribbon高级

1、负载均衡概述

(1)什么是负载均衡

(2)客户端负载均衡与服务端负载均衡

2、基于Ribbon实现负载均衡

(2)负载均衡策略

五、Nacos配置管理

1、统一配置管理

(1)在nacos中添加配置文件

(2)从微服务拉取配置

2、配置热更新

(1)方式一

(2)方式二(硬编码方式)

3、配置共享

(1)同服务内配置共享

(2)不同微服务共享配置

(3)配置共享的优先级


一、微服务的注册中心

        注册中心可以说是微服务架构中的"通讯录",它它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

1、注册中心的主要作用

        服务注册中心(下称注册中心)是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者的一个作用。注册中心一般包含如下几个功能:

(1)服务发现
  • 服务注册/反注册:保存服务提供者和服务调用者的信息。
  • 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能服务路由(可选):具有筛选整合服务提供者的能力。
(2)服务配置
  • 配置订阅:服务提供者和服务调用者订阅微服务相关的配置。
  • 配置下发:主动将配置推送给服务提供者和服务调用者。

(3)服务健康检测
  • 检测服务提供者的健康情况。

2、 常见的注册中心

        Zookeeper:zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。简单来说zookeeper=文件系统+监听通知机制。

        Eureka:Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netfix中的重要组件。

        Consul:Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,采用Raft算法保证服务的一致性,且支持健康检查。

        Nacos:Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与发现

        Eureka闭源影响

        在Euraka的GitHub上,宣布Eureka 2.x闭源。近这意味着如果开发者继续使用作为 2.x 分支上现有工作repo一部分发布的代码库和工件,则将自负风险。Nacos替换方案

二、nacos简介

        Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。nacos的作用就是一个注册中心,用来管理注册上来的各个微服务。

1、nacos实战入门
(1)搭建nacos环境

        下载完后启动nacos有两种操作:startup.cmd -m standalone 或者直接双击startup.cmd运行。

        然后访问nacos:打开浏览器输⼊http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos。

        还是订单管理服务平台,代码我就不重复展示了,就展示新知识点的代码。

(2)将商品/订单等微服务注册到nacos

        我们就以商品模块为模板,开始修改 shop-product 模块的代码,将其注册到nacos服务上:

        在pom.xml中添加nacos的依赖

        <!-- nacos客户端 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

        

        在主类上添加@EnableDiscoveryClient注解:

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

        @EnableDiscoveryClient 这个注解启用服务发现客户端功能,允许应用向服务注册中心(如 Eureka、Nacos)注册自身并从中发现其他服务。使得应用能够作为服务消费者和生产者,支持服务注册和发现。这个项目中就是用order层来调用product层和user层服务的,和他们自身的注册。

        在application.yml中添加nacos服务的地址

server:port: 8081
spring:application:name: service-productdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springwork?serverTimezone=GMTusername: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848

        在yml中主要增加nacos服务地址,cloud是Spring Cloud 的根配置节点,nocos是指定 Nacos 的相关配置。discovery是节点配置与服务发现相关的设置,这个配置使得应用能够通过 Nacos 注册到服务注册中心,并从中发现其他服务。server-addr是配置 Nacos 服务器的地址。

        

        启动服务,观察nacos的控制面板中是否有注册上来的商品/用户微服务

        显示商品和用户服务已经进行了注册。

        

        那么最后再去shop_order模块中去调用控制器中的方法

@RestController
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate IOrderService orderService;//获取nacos中服务的元数据@Autowiredprivate DiscoveryClient discoveryClient;//下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//从nacos中获取服务地址ServiceInstance serviceInstance = discoveryClient.getInstances("service-product").get(0);String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();//通过restTemplate调用商品微服务Product product = restTemplate.getForObject( "http://" + url + "/product/" + pid, Product.class);//下单(创建订单)Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);return order;}}

        这里和普通的调用不一样的是上次我们调用微服务是用"http://localhost:8081/product/" + pid,来执行服务方法和操作。

        这次用的是通过discoveryClient对象来完成微服务注册中心的调用服务。通过getInstances("service-product")从Nacos中获取名为service-product的所有服务实例。

        再通过拼接服务实例的主机名getHost()和获取端口号getPost()构建服务的 URL。大概就为http://127.0.0.1:8091/product/4。

        通过getForObject方法,调用商品服务的 /product/{pid} 接口,获取指定商品的详细信息,并将结果映射为 Product 对象。


三、服务调用Ribbon入门

        经过以上的学习,已经实现了服务的注册和服务发现。当启动某个服务的时候,可以通过HTTP的形式将信息注册到注册中心,并且可以通过SpringCloud提供的工具获取注册中心的服务列表。但是服务之间的调用还存在很多的问题,如何更加方便的调用微服务,多个微服务的提供者如何选择,如何负载均衡等。

1、Ribbon概述
(1)什么是Ribbon

        是 Netfixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中Nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务。

(2)Ribbon的主要作用

        服务调用:基于Ribbon实现服务调用,是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate 最终进行调用。

        负载均衡:当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址。

2、基于Ribbon实现订单调用商品服务
(1)坐标依赖

        在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这里不需要导入任何额外的坐标。

(2)具体实现

        首先在创建RestTemplate方法上添加 @LoadBalanced 注解:

@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class);}@Bean@LoadBalanced//负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}

        这里的@LoadBalanced是为 RestTemplate 添加负载均衡能力。Spring Cloud 会自动为这个 RestTemplate 实例配置一个负载均衡客户端(Ribbon),使其能够在调用其他服务时实现客户端的负载均衡。

        使用 @LoadBalanced 的 RestTemplate 时,可以使用服务名而不是具体的 URL。例如:http://service-product/product/4,其中 service-product 是微服务的名称,而不是具体的 IP 和端口。

        所以我们就可以通过服务名来使用其方法:

@RestController
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate IOrderService orderService;//Ribbon下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//通过restTemplate调用商品微服务String url = "service-product";Product product = restTemplate.getForObject( "http://"+url+"/product/" + pid, Product.class);//下单(创建订单)Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);return order;}}

        里面直接定义了服务名称service-product,再用getForObject调用商品服务。

四、服务调用Ribbon高级

1、负载均衡概述
(1)什么是负载均衡

        在搭建网站时,如果单节点的 web服务性能和可靠性都无法达到要求;或者是在使用外网服务时,经常担心被人攻破,一不小心就会有打开外网端口的情况,通常这个时候加入负载均衡就能有效解决服务问题。

        负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。

        负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网个例、健康检查等功能,能够有效提供系统的安全性和可用性。

(2)客户端负载均衡与服务端负载均衡

        服务端负载均衡:先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。

        客户端负载均衡:客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。

2、基于Ribbon实现负载均衡

        通过idea再启动一个 shop-product 微服务,设置其端口为8082:

        分别启动两次服务器验证效果,并查看两个控制台发现已轮询的方式调用了商品服务

(2)负载均衡策略

        Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为com.netflix.loadbalancer.IRue,实现方式如下:

  • com.netflix.loadbalancer.RoundRobinRule9:以轮询的方式进行负载均衡。
  • com.netflix.loadbalancer.RandomRue:随机策略com.netflix.loadbalancer.RetryRule :重试策略
  • com.netflix.oadbalancer.WeightedResponseTimeRule:权重策略。会计算每个服务的权重,越高的被调用的可能性越大。
  • com.netflix.loadbalancer.BestAvailableRule:最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
  • com.netflix.loadbalancer.AvailabilityFilteringRule:可用过滤策略。过滤掉故障和请 求数超过阈值的服务实例,再从剩下的实力中轮询调用。
  • ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。

        呢么根据刚才的实现代码,将shop_order模块中的pom加上负载均衡策略:

service-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule9

        这里实现了轮询方式进行负载均衡,所以就是每次我调用呢个url就会在1号控制台中输出,然后是2号控制台,紧接着又是2号控制台,依次轮询。

        还有可以设置自定义负载均衡策略:

service-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRue

        这里是使用RandomRue,意思是随机的去进行负载。

        全局设置

@Bean
public IRule randomRule(){return new RandomRule();
}

        局部设置

#需要调⽤的微服务名称
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

五、Nacos配置管理

        Nacos除了可以做注册中心,同样可以做配置管理来使用。

1、统一配置管理

        当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

        Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

        在业界常见的服务配置中心,有下面这些:

  • Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支.持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细。
  • Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。
  • SpringCloud Config这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配 置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。
  • Nacos这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。

(1)在nacos中添加配置文件

        注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

(2)从微服务拉取配置

        微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。但如果尚未读取application.yml,又如何得知nacos地址呢?因此spring引入了一种新的配置文件: bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

        配置实现步骤

        引入nacos-config依赖(在shop_product模块中导入坐标):

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> 
</dependency>

        添加bootstrap.yaml:

        不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件配置文件优先级(由高到低):
        bootstrap.properties ->bootstrap.yml ->application.properties -> application.yml

spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中⼼地址file-extension: yaml # 配置⽂件格式profiles:active: dev # 环境标识,开发环境

        然后在nacos中添加配置。

2、配置热更新

        我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。要实现配置热更新,可以使用两种方式:

        配置中心添加配置

config:appName: product
(1)方式一

        在@Value注⼊的变量所在类上添加注解@RefreshScope:

@RestController
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {@Value("${config.appName}")private String appName; @GetMapping("/nacos-config-test1") public String nacosConfingTest1() {return appName;} 
}

        @RefreshScope,这个注解来自 Spring Cloud,表示这个类中的配置可以在运行时动态刷新。只要在需要动态读取配置的类上添加此注解,Spring Cloud Config 配合 Nacos 就会在配置改变时自动更新该类中的配置属性。

        @Value("${config.appName}"),这是一个 Spring 的注解,用来从配置文件,这里我们是从刚才配置的nacos服务中的yml文件中读取。

        通过配置上面的代码就可以实现在nacos中修改服务时,不用重新启动也能获取更新

(2)方式二(硬编码方式)
@RestController 
public class NacosConfigController {@Autowired private ConfigurableApplicationContext applicationContext; @GetMapping("/nacos-config-test2") public String nacosConfingTest2() { return applicationContext.getEnvironment().getProperty("config.appName"); }
}

        这里在控制器中定义了一个ConfigurableApplicationContext实例,通过这个变量,可以访问 Spring 的环境配置和应用上下文。

        后面的方法中用getEnvironment()方法获取Environment对象,然后再通过getProperty("config.appName")获取名为 config.appName 的属性值。

3、配置共享

        当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置文件提取出来

(1)同服务内配置共享

        现步骤

  • 新建一个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面。
  • 新建一个名为service-product-test.yaml配置存放测试环境的配置。
  • 新建一个名为service-product-dev.yaml配置存放开发环境的配置。
  • 在两个环境文件中配置独有信息。
#多配置⼀段
config:env: test
#多配置⼀段
config:env: dev

        添加测试的方法

@RestController 
@RefreshScope
public class NacosConfigController {@Value("${config.env}")private String env; //3 同⼀微服务的不同环境下共享配置@GetMapping("/nacos-config-test3") public String nacosConfingTest3() { return env; }
}

(2)不同微服务共享配置

        不同服务之间实现配置共享的原理类似于文件引入,就是定义一个公共配置,然后在当前配置中引入。

        在nacos中定义一个DatalD为datasource.yaml的配置,用于所有微服务共享:

       

        然后再去把配置好的service-product-dev服务配置内容进行对重复内容删减:

        最后去修改bootstrap.yaml文件:

spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中⼼地址file-extension: yaml # 配置⽂件格式shared-dataids: DataSource.yml # 配置要引⼊的配置refreshable-dataids: DataSource.yml # 配置要实现动态配置刷新的配置profiles:active: dev # 环境标识,开发环境

        其中shared-dataids就是要引入的配置,定义要从 Nacos 配置中心引入的共享配置文件。DataSource.yml 是文件的 ID,表示要引入的数据源配置,也就是公共配置。

        refreshablee-dataids配置的是要实现动态配置刷新的配置,指定可以动态刷新的配置文件。DataSource.yml 表示当 Nacos 中该文件内容变化时,Spring 应用会自动刷新相关的配置。

        最后启动商品微服务进行测试。

(3)配置共享的优先级

        当nacos、服务本地同时出现相同属性时,优先级有高低之分:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue插值:双大括号标签、v-text、v-html、v-bind 指令

创建应用程序实例后&#xff0c;需要通过插值进行数据绑定。数据绑定是 Vue.js 最核心的一个特性。建立数据绑定后&#xff0c;数据和视图会相互关联&#xff0c;当数据发生变化时&#xff0c;视图会自动进行更新。这样就无须手动获取 DOM 的值&#xff0c;使代码更加简洁&…

外部环境连接kafka

修改配置文件外部环境连接kafka 1、kafka的docker官方镜像地址2、kafka官方介绍的三种连接方式3、方式一&#xff1a;Default configs默认配置4、方式二&#xff1a;File input&#xff08;文件输入&#xff1a;外部配置文件替换docker容器内的配置文件&#xff09;4.1、首先查…

自存实践本地访问 nginx放前端打包好的项目

nginx 部署前端项目_哔哩哔哩_bilibili 将打包好的dits文件放到 配置nginx.conf文件的location 启动命令 start nginx.exe 输入localhost即可访问打包好的项目 nginx的特点 1.静态资源 2.转发 设置代理转发请求 关闭nginx .\nginx.exe -s quit

分享从零开始学习网络设备配置--任务6.2 实现网络设备的远程管理

任务描述 某公司的网络管理员小赵负责公司办公网的管理工作&#xff0c;熟悉了公司内部设备运行情况&#xff0c;每天都需要保障公司内部网络设备的正常运行&#xff0c;同时进行办公网的日常管理和维护工作。 在安装办公网中&#xff0c;路由器和交换机放置在中心机房&…

【生日视频制作】教师节中秋节国庆节红色直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】

红色直升飞机生日视频制作教程AE模板改文字广软件告生成器素材 怎么如何做的【生日视频制作】教师节中秋节国庆节红色直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频…

【Python机器学习】NLP概述——词序和语法

词的顺序很重要&#xff0c;那些在词序列&#xff08;如句子&#xff09;中控制词序的规则被称为语言的语法&#xff08;也被称为文法&#xff09;。这是之前的词袋或词向量例子中所丢弃的信息。在大多数简短的短语甚至许多完整的句子中&#xff0c;上述词向量近似方法都可以奏…

电脑硬盘坏了怎么恢复数据?

在数字化时代&#xff0c;电脑硬盘作为存储核心&#xff0c;承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而&#xff0c;硬盘作为机械设备&#xff0c;也有其寿命和脆弱性&#xff0c;一旦出现故障&#xff0c;数据恢复便成为了一个紧迫而棘手的问题。本文…

Centos7 message日志因dockerd、kubelet、warpdrive、containerd等应用迅速增长

问题&#xff1a;公司服务器在部署一套业务后&#xff0c;message日志记录大量的dockerd、kubelet、warpdrive、containerd应用日志&#xff0c;每天增加2G大小的日志 解决方案&#xff1a; 前期吐槽下&#xff1a;发现某个帖子&#xff0c;需要会员或者花钱才能看&#xff0c…

AfuseKt v1.3.5 — 打造自己的视频库,可刮削

AfuseKt是一款功能全面的安卓视频播放器&#xff0c;支持从阿里云盘、Alist、WebDAV、Emby到Jellyfin等多个平台直接播放视频。注册简单&#xff0c;一次邮箱登记即可畅享所有功能&#xff0c;包括自动刮削和海报墙展示。无论你是电影迷还是系列剧的忠实粉丝&#xff0c;AfuseK…

Elasticsearch-关键词随机查询(8.x)

目录 一、查询语句 二、Java代码实现 基础介绍&#xff1a; ES自定义评分机制:function_score查询详解-阿里云开发者社区ES自定义评分机制:function_score查询详解https://developer.aliyun.com/article/1054571 开发版本详见&#xff1a;Elasticsearch-经纬度查询(8.x-半径…

npm安装时一直在idealTree:npm: sill idealTree buildDeps卡住不动解决方法

npm安装xmysql时一直idealTree:npm: sill idealTree buildDeps卡住不动 问题解决&#xff0c;如下图所示 解决方法&#xff1a; 1、查看.npmrc位置&#xff0c;并去目录中删掉.npmrc文件 --在cmd&#xff08;DOS页面&#xff09;界面执行下述指令&#xff0c;可查看 .npmrc 文…

数学建模起步感受(赛前15天)

0基础直接上手数模&#xff0c;因为大一&#xff01;年轻就是无所畏惧&#xff01;开个玩笑&#xff0c;因为数模比赛比一年少一年… 抱着不打也是浪费的态度&#xff0c;我开始着手准备 首先python啥也不会&#xff0c;知道有元组这玩意… 仅仅在刷软考题的时候遇到python选择…

单域名SSL证书申请三步法

申请单域名SSL证书&#xff0c;确保您的网站安全可信&#xff0c;只需简单三步&#xff1a; 选择证书类型与提供商&#xff1a;首先&#xff0c;确定您需要的单域名SSL证书类型&#xff0c;如DV&#xff08;域名验证&#xff09;证书。接着&#xff0c;选择一个信誉良好的证书提…

[003].第4节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建&#xff1a; 1.1.搭建RabbitMQ单体架构&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令(分别按照以下顺序安装…

喝酒上头的原因是什么?

酒精进入人体后&#xff0c;会被依次分解代谢成乙醛、乙酸&#xff0c;进而分解成二氧化碳和水&#xff0c;然后排出体外&#xff0c;这一代谢过程主要是依靠肝脏来进行的。如果代谢过程存在问题&#xff0c;那很有可能就会出现“上头”等不适症状。具体来说&#xff0c;主要与…

C++ 设计模式——简单工厂模式

简单工厂模式 简单工厂模式主要组成部分代码实现简单工厂模式模式的 UML 图简单工厂模式 UML 图解析优点和缺点适用场景 简单工厂模式 简单工厂模式是一种创建型设计模式&#xff0c;通过一个工厂类来负责对象的实例。这种模式将对象创建的细节封装在工厂类中&#xff0c;客户…

CAN通讯接口 8路电压电流模拟量采集模块DAM-C3054P

简介&#xff1a; DAM-C3054P为8路差分模拟量采集模块&#xff0c;16位AD&#xff0c;CAN通讯接口&#xff0c;支持CAN2.0A标准帧格式&#xff0c;支持CAN-OPEN协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 产品图片及尺寸&#xff1a; 指标参数…

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!

关键词&#xff1a; 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN独家网络安全资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…

机器学习|什么是梯度下降(小白向)|探寻最优解之路

文章目录 前言一、什么是梯度下降&#xff1f;二、梯度下降法一般步骤1.确定一个小目标——预测函数2.找到差距——代价函数3.明确搜索方向——梯度计算4.一步要走多远&#xff1f;——学习率 三、梯度下降的分类批量梯度下降&#xff08;Batch Gradient Descent&#xff09;随…

Java语言程序设计基础篇_编程练习题***16.31(游戏:四子连)

目录 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 编程练习题8.20让两个玩家在控制台上可以玩四子连的游戏。为这个程序重写一个GUI版本…