当前位置: 首页 > news >正文

springboot 集成dubbo

上一篇我们一起认识了Dubbo与RPC,今天我们就来一起学习如何使用Dubbo,并将Dubbo集成到Spring Boot的项目中。我们来看下今天要使用到的软件及版本:

软件

版本

说明

Java

11

Spring Boot

2.7.13

Spring Boot 3.0版本开始,最低支持到Java 17

Dubbo

3.2.2

Zookeeper

3.8.1

作为Dubbo的注册中心

注册中心的选择没有什么强制要求,我们这里以Zookeeper为例来做示范。

TIps:今天我们只处理Spring Boot,Dubbo与Zookeeper的集成,不会涉及到其他框架的集成。

部署Zookeeper

我们先来部署一个Zookeeper,这里我提供Windows和Linux的部署教程,如果你已经部署成功,可以跳过这部分内容。

首先是下载Zookeeper,这里我们选择Zookeeper-3.8.1版本。

Linux下可以使用wget命令下载:

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz

Tips:注意,这里我们下载的是apache-zookeeper-3.8.1-bin.tar.gz这个文件。

Linux部署Zookeeper

解压Zookeeper:

tar -zxvf apache-zookeeper-3.8.1-bin.tar.gz

Zookeeper的配置文件,配置文件位于../Zookeeper/conf目录下,复制zoo_sample.cfg文件,并命名为zoo.cfg:

cp zoo_sample.cfg zoo.cfg

在Dubbo的学习中,我们使用Zookeeper的默认配置即可,所以此处我们不需要再修改zoo.cfg。

修改profile文件:

vim /etc/profile

将Zookeeper的配置添加到profile文件中:

export ZOOKEEPER_HOME=/opt/opt/apache-zookeeper-3.8.1-bin
export PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH

刷新profile文件:

source profile

启动Zookeeper:

zkServer.sh start

正常情况下会输出日志:

ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.8.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

可以使用命令来查看Zookeeper的状态:

zkServer.sh status

单机状态输出如下日志:

ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.8.1-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone

到这里我们就在Linux服务器上成功的部署了一个简单可用的单机版Zookeeper了。

Windows部署Zookeeper

参照Linux上部署Zookeeper的步骤来到修改配置文件的部分,Windows上我们要修改dataDir的路径,并新增dataLogDir的路径:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\Apache\Apache Zookeeper 3.8.1\data
dataLogDir=D:\Apache\Apache Zookeeper 3.8.1\logs
clientPort=2181

如果系统中没有配置环境变量JAVA_HOME,我们要修改zkEnv.cmd中的JAVA_HOME配置,该文件位于../Apache Zookeeper/bin目录下:

@echo off
REM Licensed to the Apache Software Foundation (ASF) under one or more
REM contributor license agreements.  See the NOTICE file distributed with
REM this work for additional information regarding copyright ownership.
REM The ASF licenses this file to You under the Apache License, Version 2.0
REM (the "License"); you may not use this file except in compliance with
REM the License.  You may obtain a copy of the License at
REM
REM     http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.set ZOOCFGDIR=%~dp0%..\conf
set ZOO_LOG_DIR=%~dp0%..\logsREM for sanity sake assume Java 1.6
REM see: http://java.sun.com/javase/6/docs/technotes/tools/windows/java.htmlREM add the zoocfg dir to classpath
set CLASSPATH=%ZOOCFGDIR%REM make it work in the release
SET CLASSPATH=%~dp0..\*;%~dp0..\lib\*;%CLASSPATH%REM make it work for developers
SET CLASSPATH=%~dp0..\build\classes;%~dp0..\build\lib\*;%CLASSPATH%set ZOOCFG=%ZOOCFGDIR%\zoo.cfg@REM setup java environment variablesif not defined JAVA_HOME (
echo Error: JAVA_HOME is not set.
goto :eof
)set JAVA_HOME=%JAVA_HOME%if not exist "%JAVA_HOME%"\bin\java.exe (
echo Error: JAVA_HOME is incorrectly set: %JAVA_HOME%
echo Expected to find java.exe here: %JAVA_HOME%\bin\java.exe
goto :eof
)REM strip off trailing \ from JAVA_HOME or java does not start
if "%JAVA_HOME:~-1%" EQU "\" set "JAVA_HOME=%JAVA_HOME:~0,-1%"set JAVA="%JAVA_HOME%"\bin\java

我们将第41行的set JAVA_HOME=%JAVA_HOME%提前到第36行前,在在判断环境变量中是否存在JAVA_HOME前进行设置,并使用完整的路径,如:set JAVA_HOME=D:\Java\jdk11.0.18

上述内容修改完成后直接双击执行zkServer.cmd就可以启动Zookeeper了。注意,Windows下启动可能出现各种各样的错误,最常见的如启动闪退,这时可以在PowerShell中启动zkServer.cmd,来查看日志解决问题:

cd D:
PS D:\> cd '.\Apache\Apache Zookeeper 3.8.1\bin\'
PS D:\Apache\Apache Zookeeper 3.8.1\bin> .\zkServer.cmd

好了,到这里你应该已经完成了Zookeeper的部署工作了,接下来我们在Spring Boot应用中集成Dubbo。

Dubbo的XML形式集成

首先我们准备两个工程,DubboProviderXML和DubboConsumerXML,模仿服务提供方和服务使用方,创建工程的部分我们就直接跳过了,相信这一步大家都没问题。

另外Dubbo官方提供了Dubbo Initializer项目脚手架,方便大家快速构建Dubbo项目:

使用方式类似于Spring Initializr:

Tips

  • 当然你也可以在同一个工程中模拟提供方和使用方;
  • Spring Initializr严格意义上是一个错别字,但大家也都接受了这种方式,V2EX上有关于名字的讨论。

DubboProviderXML工程

在DubboProviderXML项目下创建了两个子工程:

  • provider-api,声明RPC接口
  • provider-service,核心业务逻辑的实现

此时工程结构如下:

现在修改DubboProviderXML工程的POM文件:

<modelVersion>4.0.0</modelVersion>
<groupId>com.wyz</groupId>
<artifactId>DubboProviderXML</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>DubboProviderXML</name>
<description>DubboProviderXML</description><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><modules><module>provider-api</module><module>provider-service</module>
</modules>

通常我会在DubboProviderXML工程中添加所有子项目都会用到的依赖,例如:lombok,commons-lang3等,在此我们忽略这部分内容。

配置provider-api

接着处理子工程provider-api中的POM文件:

<modelVersion>4.0.0</modelVersion>
<parent><groupId>com.wyz</groupId><artifactId>DubboProviderXML</artifactId><version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>provider-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider-api</name>
<packaging>jar</packaging>
<description>provider-api</description>

然后在provider-api中声明RPC接口:

package com.wyz.api;/**
* @author wyz
* @version 1.0
* @date 2023/6/28
*/
public interface DubboDemoXMLService {String say(String message);
}

这样provider-api就配置完成了,DubboProviderXML就有了对外提供RPC服务的入口。

Tips:需要将provider-api打包成jar,以便DubboConsumerXML使用。

配置provider-service

下面我们配置子工程provider-service的POM文件:

<modelVersion>4.0.0</modelVersion>
<parent><groupId>com.wyz</groupId><artifactId>DubboProviderXML</artifactId><version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>provider-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider-service</name>
<description>provider-service</description><properties><spring.boot.version>2.7.13</spring.boot.version><dubbo.version>3.2.2</dubbo.version><zookeeper.version>3.8.1</zookeeper.version>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>${spring.boot.version}</version></dependency><!-- dubbo-spring-boot-starter引入了dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><!-- DUbbo与Zookeeper的连接器 --><!-- curator5自身引入了Zookeeper的依赖,因此无需额外引入 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><version>${dubbo.version}</version><type>pom</type></dependency><dependency><groupId>com.wyz</groupId><artifactId>provider-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>

接下来我们在provider-service中实现这个接口:

package com.wyz.service.impl;import com.wyz.DubboDemoXMLService;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
public class DubboDemoXMLServiceImpl implements DubboDemoXMLService {@Overridepublic String say(String message) {return "XML Provider say : " + message;}
}

现在,我们有了接口,也有了接口的实现,只需要配置成Dubbo的服务即可,新增dubbo-provider.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- Dubbo的基本配置--><dubbo:application name="DubboProviderXML" qos-port="2222"/><dubbo:registry address="zookeeper://127.0.0.1:2181"/><dubbo:protocol name="dubbo"/><!-- 配置提供的服务dubboDemoXMLServiceImpl --><bean id="dubboDemoXMLServiceImpl" class="com.wyz.service.impl.DubboDemoXMLServiceImpl"/><dubbo:service interface="com.wyz.api.DubboDemoXMLService" ref="dubboDemoXMLServiceImpl"/>
</beans>

所有配置完成后,我们导入dubbo-provider.xml文件:

package com.wyz.service;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@SpringBootApplication
@ImportResource(locations = "classpath:dubbo-provider.xml")
public class ProviderServiceApplication {public static void main(String[] args) {SpringApplication.run(ProviderServiceApplication.class, args);}
}

到这里我们的DubboProviderXML工程就配置完了,此时工程的结构如下:

DubboConsumerXML工程

我们继续配置服务使用方DubboConsumerXML工程,整体流程和DubboProviderXML的配置基本一致,我们直接快进到consumer-service中的配置部分。

配置consumer-service

consumer-service的POM文件与DubboProviderXML工程的子工程provider-service完全一致,我们也直接跳过这部分内容。

接下来实现对DubboDemoXMLService#say的调用:

package com.wyz.service.impl;import com.wyz.DubboDemoXMLService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@Component
public class DubboConsumerXMLService implements CommandLineRunner {@AutowiredDubboDemoXMLService dubboDemoXMLServiceImpl;@Overridepublic void run(String... args) {String message = dubboDemoXMLServiceImpl.say("wyz");System.out.println(message);}
}

接着我们新增dubbo-consumer.xml文件,配置使用方要调用的服务:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- Dubbo的基本配置--><dubbo:application name="DubboConsumerXML" qos-port="2223"/><dubbo:registry address="zookeeper://106.75.33.232:2181"/><dubbo:protocol name="dubbo"/><!-- 配置需要调用的服务 --><dubbo:reference id="DubboDemoXMLService" interface="com.wyz.api.DubboDemoXMLService"/>
</beans>

同样的,我们导入dubbo-consumer.xml文件:

package com.wyz.service;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@SpringBootApplication
@ImportResource(locations = "classpath:dubbo-consumer.xml")
public class ConsumerServiceApplication {public static void main(String[] args) {SpringApplication.run(ConsumerServiceApplication.class, args);}
}

最后,我们启动程序,控制台应该输出如下日志:

此时DubboConsumerXML的工程结构如下:

Dubbo的注解形式集成

除了使用XML外,我们还可以使用注解的方式配置Dubbo(毕竟有很多人不喜欢XML)。同样的我们需要先创建两个工程DubboProviderAnnotation和DubboConsumerAnnotation。

DubboProviderAnnotation工程

DubboProviderAnnotation工程与DubboProviderXML的配置步骤基本一致,我们快进到接口的实现部分,这次我们需要使用@DubboService注解声明这是一个Dubbo服务:

package com.wyz.service.impl;import com.wyz.api.DubboProviderAnnotationService;
import org.apache.dubbo.config.annotation.DubboService;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@DubboService
public class DubboProviderAnnotationServiceImpl implements DubboProviderAnnotationService {@Overridepublic String say(String message) {return "DubboProviderAnnotationService say : " + message;}
}

接口有了,实现也有了,我们来配置Dubbo的相关内容,这次我们使用YAML配置:

dubbo:application:name: DubboProviderAnnotationqos-port: 2222protocol:name: dubboregistry:address: zookeeper://${zookeeper.address:127.0.0.1}:2181

接着,我们在启动类上添加@EnableDubbo注解,开启Dubbo的自动注入:

package com.wyz.service;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@SpringBootApplication
@EnableDubbo
public class ProviderServiceApplication {public static void main(String[] args) {SpringApplication.run(ProviderServiceApplication.class, args);}
}

此时DubboProviderAnnotation的结构如下:

最后我们就可以正常启动DubboProviderAnnotation项目了。

DubboConsumerAnnotation工程

有了前面的基础,相信你一定可以想到DubboConsumerAnnotation该如何配置,我们先来写调用DubboDemoAnnotationService#say的调用逻辑,此时通过@DubboReference注入接口:

package com.wyz.service.impl;import com.wyz.api.DubboProviderAnnotationService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@Component
public class DubboConsumerAnnotationService implements CommandLineRunner {@DubboReferenceDubboProviderAnnotationService dubboProviderAnnotationService;@Overridepublic void run(String... args) {String message = dubboProviderAnnotationService.say("wyz");System.out.println(message);}
}

接着来配置YAML文件:

dubbo:application:name: DubboConsumerAnnotationqos-port: 2223protocol:name: dubboregistry:address: zookeeper://${zookeeper.address:127.0.0.1}:2181

同样的,我们需要在服务使用方添加@EnableDubbo注解,开启Dubbo的自动注入:

package com.wyz.service;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/**
* @author wyz
* @version 1.0
* @date 2023/7/3
*/
@SpringBootApplication
@EnableDubbo
public class ConsumerServiceApplication {public static void main(String[] args) {SpringApplication.run(ConsumerServiceApplication.class, args);}
}

此时DubboConsumerAnnotation的结构如下:

最后我们就可以正常启动DubboConsumerAnnotation项目了。

结语

到这里我们就完成了两种形式在Spring Boot中集成Dubbo 3.X。通常来说我会选择使用XML的形式来配置Dubbo提供的服务,但会选择将Dubbo的基本信息,如:协议类型,注册中心地址等配置到YAML文件中,这是为了统一管理对外提供的服务和使用的服务,可以一目了然的看到项目提供了哪些能力,和依赖了哪些外部接口。


如果本文对你有帮助的话,还请多多点赞支持。如果文章中出现任何错误,还请批评指正。最后欢迎大家关注分享硬核Java技术的金融摸鱼侠王有志,我们下次再见!

相关文章:

springboot 集成dubbo

上一篇我们一起认识了Dubbo与RPC&#xff0c;今天我们就来一起学习如何使用Dubbo&#xff0c;并将Dubbo集成到Spring Boot的项目中。我们来看下今天要使用到的软件及版本&#xff1a; 软件 版本 说明 Java 11 Spring Boot 2.7.13 Spring Boot 3.0版本开始&#xff0c;最…...

基于YOLOV8模型和CCPD数据集的车牌目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型和CCPD数据集的车牌目标检测系统可用于日常生活中检测与定位车牌目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算…...

net user安全隐患

net user test 123456 /add #添加一个test账户,密码是123456net user test /delete #删除test账户windows administrator权限下删除其他账户&#xff0c;难道不需要知道该账户的密码吗&#xff1f; 以前没太注意&#xff0c;但是这算不算是一个漏洞呢&#xff1f; 另外&#…...

深入剖析Kubernetes之资源模型和GPU 管理

文章目录 资源模型QoS 模型GPU 管理 资源模型 在 Kubernetes 里&#xff0c;Pod 是最小的原子调度单位。这也就意味着&#xff0c;所有跟调度和资源管理相关的属性都应该是属于 Pod 对象的字段。而这其中最重要的部分&#xff0c;就是 Pod 的 CPU 和内存配置&#xff0c;如下所…...

Springboot整合HBase

Springboot整合HBase数据库 1、添加依赖 <!-- Spring Boot HBase 依赖 --> <dependency><groupId>com.spring4all</groupId><artifactId>spring-boot-starter-hbase</artifactId> </dependency> <dependency><groupId>…...

在不同操作系统上如何安装符号表提取工具(eu-strip)

前言 C开发的小伙伴都知道符号表在调试和解决崩溃时扮演着非常重要的角色&#xff0c;那么如何提取和保存发布应用程序的符号表就变得非常重要。今天就来聊一下如何在不同的操作系统上使用eu-strip提取应用程序中的符号表信息。 正文 问题 如何在不同操作系统上安装符号表提…...

钡铼R40边缘计算网关与华为云合作,促进物联网传感器数据共享与应用

场景说明 微型气象是不可预测的&#xff0c;基本上不能通过人工手段来分析其变化&#xff0c;因此必须运用新技术&#xff0c;对气象进行实时监测&#xff0c;以便采取相应的措施来避免或解决事故的发生。而常规气象环境数据采集容易造成数据损失、人力成本高、数据安全性差、…...

图表背后的故事:数据可视化的威力与影响

数据可视化现在在市场上重不重要&#xff1f;这已经不再是一个简单的问题&#xff0c;而是一个不可忽视的现实。随着信息时代的来临&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;而数据可视化则成为释放数据价值的重要工具。 在当今竞争激烈的商业环境中&#xf…...

C++ 信号处理

信号是由操作系统传给进程的中断&#xff0c;会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上&#xff0c;可以通过按 CtrlC 产生中断。 有些信号不能被程序捕获&#xff0c;但是下表所列信号可以在程序中捕获&#xff0c;并可以基于信号采取适当的动作。这些…...

电源模块的降额曲线

大家好&#xff0c;这里是大话硬件。 今天想写这篇文章来分享在前段时间了解的一个知识点——电源模块的降额曲线。 为什么要写这个呢&#xff1f;对于专门做电源的同学来说&#xff0c;肯定觉得很简单。但是对于一个非电源行业的人来说&#xff0c;曲线应该如何解读&#xff…...

uni-app 之 安装uView,安装scss/sass编译

uni-app 之 安装uView&#xff0c;安装scss/sass编译 image.png image.png image.png 点击HBuilder X 顶部&#xff0c;工具&#xff0c;插件安装&#xff0c;安装新插件 image.png image.png 安装成功&#xff01; 注意&#xff0c;一定要先登录才可以安装 image.png 1. 引…...

CSS中如何隐藏元素但保留其占位空间(display:nonevsvisibility:hidden)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 隐藏元素但保留占位空间⭐ display: none;⭐ visibility: hidden;⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…...

【rust/egui】(八)使用panels给你的应用划分功能区块

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 panel是啥 panel是ui上的一块区域&…...

QT实现任意阶贝塞尔曲线绘制

bezier曲线在编程中的难点在于求取曲线的系数&#xff0c;如果系数确定了那么就可以用微小的直线段画出曲线。bezier曲线的系数也就是bernstein系数&#xff0c;此系数的性质可以自行百度&#xff0c;我们在这里是利用bernstein系数的递推性质求取&#xff1a; 简单举例 两个…...

【Java 基础篇】Java 数组使用详解:从零基础到数组专家

如果你正在学习编程&#xff0c;那么数组是一个不可或缺的重要概念。数组是一种数据结构&#xff0c;用于存储一组相同类型的数据。在 Java 编程中&#xff0c;数组扮演着非常重要的角色&#xff0c;可以帮助你组织、访问和操作数据。在本篇博客中&#xff0c;我们将从零基础开…...

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…...

docker_python-django_uwsgi_nginx_浏览器_网络访问映过程

介绍 1&#xff1a;介绍docker中使用uwsgi服务器启动django 设置了uwsgi的脚本 2&#xff1a;介绍启动uwsgi后&#xff0c;使用本地浏览器去访问这个容器中的端口 3&#xff1a;分别使用了3个ip地址去访问这个服务 1&#xff1a;使用本地连接*2 2&#xff1a;使用windows系统里…...

Python爬取天气数据并进行分析与预测

随着全球气候的不断变化&#xff0c;对于天气数据的获取、分析和预测显得越来越重要。本文将介绍如何使用Python编写一个简单而强大的天气数据爬虫&#xff0c;并结合相关库实现对历史和当前天气数据进行分析以及未来趋势预测。 1 、数据源选择 选择可靠丰富的公开API或网站作…...

基础算法-递推算法-学习

现象&#xff1a; 基础算法-递推算法-学习 方法&#xff1a; 这就是一种递推的算法思想。递推思想的核心就是从已知条件出发&#xff0c;逐步推算出问题的解 最常见案例&#xff1a; 一&#xff1a;正向递推案例&#xff1a; 弹力球回弹问题&#xff1a; * 弹力球从100米高…...

L1-056 猜数字(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…...

第 361 场 LeetCode 周赛题解

A 统计对称整数的数目 枚举 x x x class Solution { public:int countSymmetricIntegers(int low, int high) {int res 0;for (int i low; i < high; i) {string s to_string(i);if (s.size() & 1)continue;int s1 0, s2 0;for (int k 0; k < s.size(); k)if …...

07-架构2023版-centos+docker部署Canal 实现多端数据同步

canal 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )canal 解析 binary log 对象(原始为 byte 流)基于日志增量订阅和消费的业务包括 数据库镜…...

过滤器的应用-Filter

过滤器 1.工作原理 2.创建Filter 2.1通过注解的方式实现 //创建一个类&#xff0c;实现Filter接口 WebFilter(urlPatterns "/myfilter") //urlPatterns表示需要拦截的路径 public class MyFilter implements Filter {Overridepublic void doFilter(ServletReques…...

leetcode236. 二叉树的最近公共祖先(java)

二叉树的最近公共祖先 题目描述递归法代码演示 上期经典 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q …...

spacy安装旧版本en_core_web_sm的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Qt +VTK+Cmake 编译和环境配置(第一篇 采坑)

VTK下载地址&#xff1a;https://vtk.org/download/ cmake下载地址&#xff1a;https://cmake.org/download/ 版本对应方面&#xff0c;如果你的项目对版本没有要求&#xff0c;就不用在意。我就是自己随机搭建的&#xff0c;VTK选择最新版本吧&#xff0c;如果后面其他的库不…...

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南宁师范大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南宁师范大学图书馆...

C++/C# : C#和C++的不同

C#和C是两种不同的编程语言&#xff0c;虽然在某些方面它们具有相似之处&#xff0c;但它们也有一些明显的不同点&#xff0c;如下&#xff1a; C是一种静态类型编程语言&#xff0c;而C#是一种动态类型编程语言。 C允许开发者手动管理内存的分配和释放&#xff0c;但是C#的垃…...

PCL-直通滤波器原理及实验

文章目录 原理使用过程代码实验总结 原理 直通滤波器的作用是过滤在指定维度方向上取值不在给定值域内的点&#xff0c;即点云数据有xyz三维坐标&#xff0c;选择一个方向的维度的数据&#xff0c;设置一个范围&#xff0c;在这个范围中的点云会被保留&#xff0c;不在此范围内…...

数学建模:相关性分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;相关性分析 文章目录 数学建模&#xff1a;相关性分析相关性分析两变量的相关分析PearsonSpearmanKendall tua-b 双变量关系强度测量的指标相关系数的性质代码实现example偏相关分析 相…...