干货|SpringCloud-Eureka注册中心、服务提供者与消费者

news2024/11/16 15:42:46

内容速览:

  • 一、关于注册中心、服务注册、服务发现
    • 1问:为什么需要注册中心?
    • 2问:什么是服务注册?
    • 3问:什么是服务发现?
  • 二、关于 Eureka 实现服务注册与服务发现
    • 1.Eureka的特点
    • 2.Eureka注册中心
    • 3.Eureka客户端

一、关于注册中心、服务注册、服务发现

1问:为什么需要注册中心?

随着微服务框架的兴起,服务节点越来越多,服务间的调用会像蜘蛛网一样越来越密集,简单的文件配置形式将无法满足日渐增加的调用关系,所以需要一个职能独立、高可用的中间商-注册中心,来维系这种调用和被调用的关系。

2问:什么是服务注册?

服务提供者将自己的信息写入到注册中心的服务清单,注册中心会定期监测上面的服务,确定服务是否存活,及时排除故障服务。

3问:什么是服务发现?

服务治理框架下,服务消费者向注册中心表明需要调用的服务名,注册中心在服务清单上获取真实的访问信息给到服务消费者。服务提供者可以被服务消费者发现,服务消费者可以主动获取服务提供者的信息。

二、关于 Eureka 实现服务注册与服务发现

1.Eureka的特点

  • Eureka包含服务端和客户端组件,均采用Java开发,所以对Java实现的分布式系统适配良好
  • 其他较为流行的开发平台也有对Eureka的封装
  • Eureka提供了Restful API,非Java语言能够通过API方式来实现自己的客户端程序
  • Eureka是典型的AP型注册中心,服务端依赖其强一致性,提供了良好的服务实例可用性。但是AP有一个典型的情况就是当集群自身出现问题的时候,为保证数据的一致性,会无法对外提供服务,进入自我保护模式。当集群数据同步一致后,又能对外提供服务。
  • Eureka客户端会将自身服务注册到注册中心,并通过服务心跳进行续约,并且能够定期拉取注册中心的服务清单到本地,并进行周期性缓存,便于本地服务的真实IP调用。

以下测试使用版本信息

java11
gradle
springboot:2.3.12.RELEASE
springcloud:Hoxton.SR12

2.Eureka注册中心

加入依赖:

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}

在服务端主类上,开启Eureka Server,@EnableEurekaServer一个注解开启Eureka注册中心模式

@EnableEurekaServer //一个注解开启Eureka注册中心模式
@SpringBootApplication
public class EurekaserverApplication {

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

}

Eureka Server默认也想自己注册自己的服务,可以使用配置进行关闭

public class EurekaClientConfigBean{
private boolean registerWithEureka = true;
private boolean fetchRegistry = true;
...
}

SpringBoot中配置如下:

server:
  port: 8801
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #关闭自己注册
    fetch-registry: false #关闭拉取注册
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

将服务启动后,能够看到Eureka Server的管理页面
在这里插入图片描述
服务端启动后,能够看到客户端的注册信息,也能够在页面上查看到注册实例的信息与状态

 ......
2023-06-08 10:31:40.186  INFO 29553 --- [           main] DiscoveryClientOptionalArgsConfiguration : Eureka HTTP Client uses Jersey
2023-06-08 10:31:40.205  WARN 29553 --- [           main] ockingLoadBalancerClientRibbonWarnLogger : You already have RibbonLoadBalancerClient on your classpath. It will be used by default. As Spring Cloud Ribbon is in maintenance mode. We recommend switching to BlockingLoadBalancerClient instead. In order to use it, set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or remove spring-cloud-starter-netflix-ribbon from your project.
2023-06-08 10:31:40.256  INFO 29553 --- [           main] o.s.c.n.eureka.InstanceInfoFactory       : Setting initial instance status as: STARTING
2023-06-08 10:31:40.285  INFO 29553 --- [           main] com.netflix.discovery.DiscoveryClient    : Initializing Eureka in region us-east-1
2023-06-08 10:31:40.285  INFO 29553 --- [           main] com.netflix.discovery.DiscoveryClient    : Client configured to neither register nor query for data.
2023-06-08 10:31:40.294  INFO 29553 --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp 1686191500293 with initial instances count: 0
2023-06-08 10:31:40.321  INFO 29553 --- [           main] c.n.eureka.DefaultEurekaServerContext    : Initializing ...
2023-06-08 10:31:40.323  WARN 29553 --- [           main] c.n.eureka.cluster.PeerEurekaNodes       : The replica size seems to be empty. Check the route 53 DNS Registry
2023-06-08 10:31:40.338  INFO 29553 --- [           main] c.n.e.registry.AbstractInstanceRegistry  : Finished initializing remote region registries. All known remote regions: []
2023-06-08 10:31:40.339  INFO 29553 --- [           main] c.n.eureka.DefaultEurekaServerContext    : Initialized
2023-06-08 10:31:40.351  INFO 29553 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 2 endpoint(s) beneath base path '/actuator'
2023-06-08 10:31:40.410  INFO 29553 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application UNKNOWN with eureka with status UP
2023-06-08 10:31:40.412  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Setting the eureka configuration..
2023-06-08 10:31:40.413  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Eureka data center value eureka.datacenter is not set, defaulting to default
2023-06-08 10:31:40.414  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Eureka environment value eureka.environment is not set, defaulting to test
2023-06-08 10:31:40.425  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : isAws returned false
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Initialized server context
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] c.n.e.r.PeerAwareInstanceRegistryImpl    : Got 1 instances from neighboring DS node
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] c.n.e.r.PeerAwareInstanceRegistryImpl    : Renew threshold is: 1
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] c.n.e.r.PeerAwareInstanceRegistryImpl    : Changing status to UP
2023-06-08 10:31:40.435  INFO 29553 --- [      Thread-10] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2023-06-08 10:31:40.446  INFO 29553 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8901 (http) with context path ''
2023-06-08 10:31:40.447  INFO 29553 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8901
2023-06-08 10:31:40.470  INFO 29553 --- [           main] c.l.e.EurekaserverApplication            : Started EurekaserverApplication in 3.977 seconds (JVM running for 4.644)
2023-06-08 10:39:40.450  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 1ms
2023-06-08 10:40:40.455  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2023-06-08 10:40:43.326  INFO 29553 --- [nio-8901-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-06-08 10:40:43.326  INFO 29553 --- [nio-8901-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-06-08 10:40:43.350  INFO 29553 --- [nio-8901-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 24 ms
2023-06-08 10:40:43.651  INFO 29553 --- [nio-8901-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance CLIENT1/192.168.2.180:client1:8902 with status UP (replication=false)
2023-06-08 10:41:40.336  WARN 29553 --- [eerNodesUpdater] c.n.eureka.cluster.PeerEurekaNodes       : The replica size seems to be empty. Check the route 53 DNS Registry
2023-06-08 10:41:40.459  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 2ms
2023-06-08 10:42:40.464  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms

3.Eureka客户端

加入依赖:

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

客户端配置:

server:
  port: 8902
spring:
  application:
    name: client1 #默认使用服务名称进行访问,所以必须要起一个有指向意义的服务名字
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8901/eureka/
    fetch-registry: true  #默认true
    register-with-eureka: true #默认true

在客户端主类上,通过EnableDiscoveryClient注解开启服务注册与发现

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaclientApplication {

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

使用DiscoveryClient获取服务清单,获取服务实例明细

@Slf4j
@RestController
@RequestMapping("test")
public class TestController {
    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(@PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }

    @GetMapping("/discovery")
    public String discovery() {
        List<String> serviceNames = discoveryClient.getServices();
        for (String serviceName : serviceNames) {
            log.info("***** element:" + serviceName);
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
            for (ServiceInstance instance : instances) {
                log.info(instance.toString());
            }
        }
        return "success";
    }
}

服务实例的信息,包含后续服务调用所需的IP与端口等必须信息

[
  {
    "uri": "http://192.168.2.180:8902",
    "metadata": {
      "management.port": "8902"
    },
    "port": 8902,
    "host": "192.168.2.180",
    "scheme": "http",
    "secure": false,
    "instanceId": "192.168.2.180:client1:8902",
    "serviceId": "CLIENT1",
    "instanceInfo": {
      "instanceId": "192.168.2.180:client1:8902",
      "app": "CLIENT1",
      "appGroupName": null,
      "ipAddr": "192.168.2.180",
      "sid": "na",
      "homePageUrl": "http://192.168.2.180:8902/",
      "statusPageUrl": "http://192.168.2.180:8902/actuator/info",
      "healthCheckUrl": "http://192.168.2.180:8902/actuator/health",
      "secureHealthCheckUrl": null,
      "vipAddress": "client1",
      "secureVipAddress": "client1",
      "countryId": 1,
      "dataCenterInfo": {
        "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
        "name": "MyOwn"
      },
      "hostName": "192.168.2.180",
      "status": "UP",
      "overriddenStatus": "UNKNOWN",
      "leaseInfo": {
        "renewalIntervalInSecs": 30,
        "durationInSecs": 90,
        "registrationTimestamp": 1686192043567,
        "lastRenewalTimestamp": 1686192193487,
        "evictionTimestamp": 0,
        "serviceUpTimestamp": 1686192043567
      },
      "isCoordinatingDiscoveryServer": false,
      "metadata": {
        "management.port": "8902"
      },
      "lastUpdatedTimestamp": 1686192043568,
      "lastDirtyTimestamp": 1686192043464,
      "actionType": "ADDED",
      "asgName": null
    }
  }
]

客户端启动后能够看到客户端主动注册的日志

.......
2023-06-08 10:40:42.607  INFO 29923 --- [           main] DiscoveryClientOptionalArgsConfiguration : Eureka HTTP Client uses Jersey
2023-06-08 10:40:42.664  WARN 29923 --- [           main] ockingLoadBalancerClientRibbonWarnLogger : You already have RibbonLoadBalancerClient on your classpath. It will be used by default. As Spring Cloud Ribbon is in maintenance mode. We recommend switching to BlockingLoadBalancerClient instead. In order to use it, set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or remove spring-cloud-starter-netflix-ribbon from your project.
2023-06-08 10:40:42.750  INFO 29923 --- [           main] o.s.c.n.eureka.InstanceInfoFactory       : Setting initial instance status as: STARTING
2023-06-08 10:40:42.782  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Initializing Eureka in region us-east-1
2023-06-08 10:40:42.935  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using JSON encoding codec LegacyJacksonJson
2023-06-08 10:40:42.935  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using JSON decoding codec LegacyJacksonJson
2023-06-08 10:40:43.056  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using XML encoding codec XStreamXml
2023-06-08 10:40:43.056  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using XML decoding codec XStreamXml
2023-06-08 10:40:43.144  INFO 29923 --- [           main] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Disable delta property : false
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Single vip registry refresh property : null
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Force full registry fetch : false
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Application is null : false
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Registered Applications size is zero : true
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Application version is -1: true
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Getting all instance registry info from the eureka server
2023-06-08 10:40:43.457  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : The response status is 200
2023-06-08 10:40:43.458  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Starting heartbeat executor: renew interval is: 30
2023-06-08 10:40:43.460  INFO 29923 --- [           main] c.n.discovery.InstanceInfoReplicator     : InstanceInfoReplicator onDemand update allowed rate per min is 4
2023-06-08 10:40:43.463  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp 1686192043462 with initial instances count: 0
2023-06-08 10:40:43.464  INFO 29923 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application CLIENT1 with eureka with status UP
2023-06-08 10:40:43.464  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1686192043464, current=UP, previous=STARTING]
2023-06-08 10:40:43.466  INFO 29923 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_CLIENT1/192.168.2.180:client1:8902: registering service...
2023-06-08 10:40:43.492  INFO 29923 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8902 (http) with context path ''
2023-06-08 10:40:43.493  INFO 29923 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8902
2023-06-08 10:40:43.504  INFO 29923 --- [           main] c.l.e.EurekaclientApplication            : Started EurekaclientApplication in 2.806 seconds (JVM running for 4.028)
2023-06-08 10:40:43.653  INFO 29923 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_CLIENT1/192.168.2.180:client1:8902 - registration status: 204
2023-06-08 10:41:13.464  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Disable delta property : false
2023-06-08 10:41:13.464  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Single vip registry refresh property : null
2023-06-08 10:41:13.464  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Force full registry fetch : false
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Application is null : false
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Registered Applications size is zero : true
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Application version is -1: false
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Getting all instance registry info from the eureka server
2023-06-08 10:41:13.515  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : The response status is 200
2023-06-08 10:41:54.752  INFO 29923 --- [nio-8902-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-06-08 10:41:54.752  INFO 29923 --- [nio-8902-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-06-08 10:41:54.758  INFO 29923 --- [nio-8902-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 6 ms
2023-06-08 10:42:07.625  INFO 29923 --- [nio-8902-exec-3] c.l.e.controller.TestController          : ***** element:client1
2023-06-08 10:42:07.628  INFO 29923 --- [nio-8902-exec-3] c.l.e.controller.TestController          : [EurekaDiscoveryClient.EurekaServiceInstance@64ca6245 instance = InstanceInfo [instanceId = 192.168.2.180:client1:8902, appName = CLIENT1, hostName = 192.168.2.180, status = UP, ipAddr = 192.168.2.180, port = 8902, securePort = 443, dataCenterInfo = com.netflix.appinfo.MyDataCenterInfo@5288f575]

默认是使用appname的方式,要求必须配置spring.application.name,如果不希望使用appname来访问服务,可以配置使用IP形式。

eureka:
  instance:
    prefer-ip-address: true #强制使用IP

以上是最基础的服务注册中心与服务提供者的搭建过程,能够启动一个服务注册中心,启动一个服务客户端,客户端向注册中心注册自己,且能够获取注册中心上的服务清单。

此外,还有高可用版本的服务注册中心,即两个及以上的eurekaserver节点,他们相互注册,服务提供者可以向两个节点注册自己的信息,任何一个服务注册节点宕机不会影响各服务节点间的调用。

以及服务消费者请求多服务提供者之间的负载均衡策略,依靠Ribbon实现。

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

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

相关文章

Linux防火墙学习笔记3

iptables链的概念&#xff1a; 当客户端访问服务器端的Web服务的时候&#xff0c;客户端发送请求报文到网卡&#xff0c;而TCP/IP协议栈是属于内核的一部分。客户端的请求报文会通过内核的TCP协议传输到用户空间的Web服务&#xff0c;而客户端报文的目的地址为Web服务器所监听的…

裸辞后,过于真实...

前言 我从事软件测试行业&#xff0c;我仅从个人体验上说一下裸辞一个月的心路历程。 本人从事软件测试行业9年&#xff0c;主流测试软件都会用&#xff0c;功能&#xff0c;性能&#xff0c;接口&#xff0c;自动化测试都能独立搞定&#xff0c;近5年测试管理经验。年龄31岁…

城市内涝的原因及解决措施

城市内涝是城市面临的一个严重问题&#xff0c;它不仅会影响城市的交通、生产和生活&#xff0c;还会对城市的环境和生态造成破坏。 城市内涝是指由于强降水或连续性降水超过城市排水能力致使城市内产生积水灾害的现象。造成内涝的客观原因是降雨强度大&#xff0c;范围集中。…

Stable Diffusion使用入门教程

本文参考bilibili的链接&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 目录 一、prompt提示词 1、概况 2、prompt分类 3、提示词的权重分配 4、…

使用 ChatGPT(简单)+ GitHub 存储库创建 C# 聊天机器人

在本指南中&#xff0c;我们将深入探讨使用 ChatGPT 和 C# 构建聊天机器人的过程。我们将涵盖从设置 ChatGPT API 访问到部署聊天机器人的所有内容。让我们开始吧&#xff01; 最后你会发现 GitHub Repo 设置您的 ChatGPT API 访问权限 在我们开始构建我们的聊天机器人之前&…

day4 ARM异常处理

目录 异常 概念 处理机制 ARM异常源 ARM异常模式 ARM异常响应 异常向量表 FIQ和IRQ ARM微架构 指令流水线 多核处理器 异常 概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生这时处理器就要将当前的程序暂停下来转而去处理这个异常的时间异常事件处…

为什么CRM一定要走行业化?

很多企业、很多销售对CRM的负面评价集中在不够贴合行业、不人性化&#xff0c;也就是功能不够细分和实用。因为CRM几乎是所有企业管理系统中最贴近业务实际的&#xff0c;但各行各业的业务千差万别&#xff0c;所以功能完备、使用满意度高的CRM一定是深度行业化、与不同行业业务…

计算机网络第三章——数据链路层(上)

提示&#xff1a;节物风光不相待。桑田碧海须臾改 文章目录 前言3.1.1 数据链路层功能数据链路层功能概述 3.2.1 封装成帧和透明传输封装成帧透明传输组帧的四种方式字符计数法字符填充法零比特填充法违规编码法 3.3.1 差错控制&#xff08;检错编码&#xff09;奇偶校验码CRC循…

【编程语言 · C语言 · while语句】

​while 语句 循环 在前面我们了解到, 程序在运行时可以通过判断, 检验条件作出选择。此处&#xff0c;程序还必须能够重复&#xff0c; 也就是反复执行一段指令&#xff0c; 直到满足某个条件为止。 while 语句 while语句可以执行循环结构。 语法&#xff1a; while(表达…

6.8 互斥锁/读写锁的概念及使用、死锁的避免

目录 线程通讯-互斥 互斥锁初始化-pthread_mutex_init 互斥锁销毁pthread_mutex_destroy 申请锁-pthread_mutex_lock 释放锁-pthread_mutex_unlock 读写锁 死锁的避免 ​编辑 条件变量 线程的GDB调试 笔记 线程的互斥和同步 临界资源概念&#xff1a; 互斥锁的创…

在京东待了几年,感觉自己废了····

在一家公司待久了技术能力反而变弱了&#xff0c;原来的许多知识都会慢慢遗忘&#xff0c;这种情况并不少见。 一个京东员工发帖吐槽&#xff1a;感觉在大厂快待废了&#xff0c;出去面试问自己接口环境搭建、pytest测试框架&#xff0c;自己做点工太久都忘记了。平时用的时候…

【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目

车牌识别基础功能演示 摘要&#xff1a;车牌识别系统(Vehicle License Plate Recognition&#xff0c;VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息&#xff08;含汉字字符、英文字母、阿拉伯数字及号牌颜色&#xff09;进行处理的技术。车牌识别是现代智能交通…

FMC子卡设计方案原理图:两路250Msps AD、两路600Msps DA FMC子卡

一、板卡概述 ADC采用TI的ADS62P49&#xff0c;2通道250M&#xff0c;14bit&#xff0c;共1片&#xff1b; DAC采用ADI的AD9122&#xff0c;2通道&#xff0c;16bit&#xff0c;可达1.2G&#xff0c;共1片&#xff1b; 时钟采用AD9516&#xff0c;支持板上时钟和外接时钟…

驱动--自动创建设备节点

自动创建设备节点 头文件&#xff1a;#include <linux/device.h> 自动创建设备节点&#xff1a; struct class *cls; cls class_create(owner, name) /void class_destroy(struct class *cls) 功能&#xff1a;向用户空间提交目录信息 参数&#xff1a; owner :THIS_MOD…

打卡有礼!快来 2023 开放原子全球开源峰会找龙蜥玩~

回望过去&#xff0c; 2022 年开放原子全球开源峰会上&#xff0c;龙蜥社区携新一届理事成员以及 18 位产学研大咖重磅亮相&#xff0c;社区论坛及展区更是吸引了近 1400 位参会者参与互动&#xff0c;现场热闹非凡。再看今朝&#xff0c;2023 年开放原子全球开源峰会举办在即&…

淘宝618每日一猜答案(6月8日)明星孙怡最喜欢的显瘦单品?

淘宝6月8日每日一猜答案是什么&#xff1f;&#xff0c;接下来也会给大家来介绍一下6月8日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月8日答案分享 活动问题&#xff1a;明星孙怡最喜欢的显瘦单品&#xff1f; 活动答案&#xff1a;【鲨鱼裤】 还有打开手机淘宝&#xff0c…

Java 高效处理千万级数据:技巧与最佳实践

引言 这篇文章主要为大家简单介绍 Java 如何处理千万级数据&#xff0c; 随着大数据时代的到来&#xff0c;数据量持续呈现爆炸式增长。在这种背景下&#xff0c;如何快速、高效地处理和分析千万级甚至更大规模的数据&#xff0c;成为企业和开发者面临的重要挑战。处理大数据…

通过Typora,以CSDN作为图床、解决CSDN防盗链问题、将CSDN博客搬到hexo上

完美将csdn的md(包括图片)复制到hexo上 其实主要就是复制图片&#xff0c;因为csdn有防盗链&#xff0c;自己的hexo上不能拉取csdn上的图片资源 1. 安装Typora Typora作为本地的md编辑器&#xff0c;有在复制网络图片时&#xff0c;直接将其保存到本地的能力&#xff0c;我们…

集权攻防——身份认证协议之NTLM

在Kerberos出现之前&#xff0c;NTLM被广泛应用于工作组和域环境&#xff0c;是更早的用于对用户进行身份验证的协议。 相比于Kerberos&#xff0c;NTLM的认证原理比较简单&#xff0c;主要通过对比客户端和服务端加密后的数据&#xff0c;判断其是否一致&#xff0c;以确定用…

浅析Spring生命周期

前言 Spring框架是一个非常流行的Java企业级应用程序框架&#xff0c;已经成为许多生产环境中的首选技术。它提供了一种便捷的方法来帮助开发人员构建可扩展和模块化的企业级应用程序。在Spring框架中&#xff0c;Bean生命周期是非常重要的一部分&#xff0c;它负责Bean的创建…