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

部署Tomcat及其负载均衡

        Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所有Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。

1、案例实施

1.1、实施准备

1)关闭firewalld防火墙。

[root@localhost ~]# systemctl stop firewalld

2)在安装Tomcat之前必须先安装JDK。JDK 的全称是 Java Development Kit,是Sun公司免费
提供的Java语言的软件开发工具包,其中包含Java虚拟机(JVM)。编写好的Java源程序经过编译
可形成Java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了Java的跨平台性。       

        在平台兼容性方面,JDK作为解释字节码文件并据此调用操作系统API实现对应功能的 Java虚拟机,与操作系统类型和平台位数密切相关,因此存在不同类型的版本,而Tomcat也具有上述特征,默认情况下JDK已经安装,所以需要预先下载 Tomcat,本章中所使用的 Tomcat 软件的源码包为apache-tomcat-8.5.16.tar.gz。

1.2、查看JDK是否安装

        运行java -version命令查看java是否安装。如果没有安装需要自行下载安装。

[root@localhost ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

1.3、安装配置Tomcat

1)解压apache-tomcat-8.5.16.tar.gz包。

[root@localhost ~]# tar xf apache-tomcat-8.5.16.tar.gz 

2)解压后生成apache-tomcat-8.5-16文件夹,将该文件夹移动到/usr/local/下,并改名为tomcat8。

[root@localhost ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8

3)启动tomcat。

[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.

        Tomcat默认运行在8080端口,运行netstat命令查看8080端口监听的信息。

[root@localhost ~]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      63339/java    

4)打开浏览器访问测试:http://192.168.136.21:8080/,如果出现以下界面则表示Tomcat已经启动成功。

        如果想关闭Tomcat,则运行/usr/local/tomcat8/bin/shutdown.sh命令。

1.4、Tomcat配置相关说明

        tomcat的主目录为/usr/local/tomcat8/。

[root@localhost ~]# cd /usr/local/tomcat8/
[root@localhost tomcat8]# ll
总用量 92
drwxr-x--- 2 root root  4096 1月  13 14:36 bin
drwx------ 3 root root   254 1月  13 16:06 conf
drwxr-x--- 2 root root  4096 1月  13 14:36 lib
-rw-r----- 1 root root 57092 6月  22 2017 LICENSE
drwxr-x--- 2 root root   197 1月  13 14:37 logs
-rw-r----- 1 root root  1723 6月  22 2017 NOTICE
-rw-r----- 1 root root  7064 6月  22 2017 RELEASE-NOTES
-rw-r----- 1 root root 15946 6月  22 2017 RUNNING.txt
drwxr-x--- 2 root root    30 1月  13 14:36 temp
drwxr-x--- 7 root root    81 6月  22 2017 webapps
drwxr-x--- 3 root root    22 1月  13 14:37 work

1)主要目录说明。

I --- bin/:存放Windows或Linux平台上启动和关闭Tomcat的脚本文件。
I --- conf/:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml。
I --- lib/:存放Tomcat运行需要的库文件(JARS)。
| --- logs:存放Tomcat执行时的LOG文件。
| --- webapps:Tomcat的主要Web发布目录(包括应用程序示例)。
|-- work:存为JSP编译后产生的class 文件

2)配置文件说明。

[root@localhost tomcat8]# ll conf/
总用量 224
drwxr-x--- 3 root root     23 1月  13 14:37 Catalina
-rw------- 1 root root  13816 6月  22 2017 catalina.policy
-rw------- 1 root root   7376 6月  22 2017 catalina.properties
-rw------- 1 root root   1338 6月  22 2017 context.xml
-rw------- 1 root root   1149 6月  22 2017 jaspic-providers.xml
-rw------- 1 root root   2358 6月  22 2017 jaspic-providers.xsd
-rw------- 1 root root   3622 6月  22 2017 logging.properties
-rw------- 1 root root   7607 1月  13 16:06 server.xml
-rw------- 1 root root   2164 6月  22 2017 tomcat-users.xml
-rw------- 1 root root   2633 6月  22 2017 tomcat-users.xsd
-rw------- 1 root root 168251 6月  22 2017 web.xml

catalina.policy:权限控制配置文件。
catalina.properties:Tomcat 属性配置文件.
context.xml:上下文配置文件。
logging.properties:日志log相关配置文件。
server.xml:主配置文件。
tomcat-users.xml:manager-gui 管理用户配置文件(Tomcat安装后提供一个manager-gui的管理界面,通过配置该文件可以开启访问)。
web.xml:Tomcat的servlet,servlet-mapping.filter、MIME等相关配置。

1.5、Tomcat主配置文件说明

         server.xml为Tomcat的主要配置文件,通过配置该文件,可以修改Tomcat的启动端口、网站目录、虚拟主机、开启https等重要功能。

        整个server.xml由以下结构构成:< Server>、<Service>、< Connector/>、< Engine>、<Host>、<Context>、</Context>、</Host>、</Engine>、</Service>和</Server>。
        其中<!-- -->内的内容是注释信息,黑色斜体部分是我们需要注意和需要经常更改的部分。

1.6、Tomcat Server的组成部分说明

1)Server

        Server元素代表了整个Catalina的servlet容器


2) Service
        Service 是这样一个集合:它由一个或者多个Connector,以及一个Engine(负责处理所有Connector所获得的客户请求)组成。



3) Connector
        一个Connector 在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine
处获得回应并返回客户。
        Tomcat 有两个典型的 Connector,一个直接侦听来自 browser 的 http 请求,一个侦听来自其他WebServer 的请求.
        Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求。
        Coyote JK2 Connector 在端口8009处侦听来自其他WebServer(Apache)的servlet/jsp代理请求。



4) Engine
        Engine下可以配置多个虚拟主机 Virtual Host,每个虚拟主机都有一个域名。
        当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理。
        Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来
处理。



5) Host
        Host 代表一个Virtual Host,即虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配。
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,
有一个Context path。
        当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context 来处理,匹配的方法是“最长匹配”,所以一个path == I"的Context将成为该Host的默认Context。
        所有无法和其他Context的路径名匹配的请求都将最终和该默认Context匹配。



6) Context
        一个Context对应于-个Web Application,一个Web Application由一个或者多个Servlet 组成。

1.7、建立java的Web站点

 1)在根目录下建立一个web目录,并在里面建立一个webapp1目录,用于存放网站文件。

[root@localhost ~]# mkdir -pv /web/webapp1

2)在webapp1目录下建立一个index.jsp的测试页面。


[root@localhost ~]# vim /web/webapp1/index.jsp 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html><head><title>JSP test1 page</title></head><body><% out.println("Welcom to test site,http:www.test1.com");%></body>
</html>

3)修改Tomcat的server.xml文件。

        定义一个虚拟主机,并将网站文件路径指向已经建立的/web/webapp1,在host段增加context段。

[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Context docBase="/web/webapp1" path="" reloadable="false" ></Context>

4)关闭Tomcat,再重新启动。080

[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.

5)通过浏览器访问http://192.168.136.21:8080/,出现下图则说明该Tomcat站点已经配置成功,并且已经能够运行JSP了。

2、案例:Nginx+Tomcat负载均衡群集

2.1、Tomcat2 server配置

        Tomcat2 server配置方法与tomcat1基本相同,其中包括:

1)关闭防火墙。

2)确认是否安装JDK、JAVA版本与Tomcat1 server保持一致。

3)安装配置Tomcat,版本与Tomcat1 server保持一致。

4)创建/web/webapp1目录,修改Tomcat配置文件server.xml,将网站文件目录更改到/web/webapp1/路径下。

5)在/web/webapp1/路径下建立index.jsp,为了区别测试将测试页面index.jsp的内容更改如下。


[root@localhost ~]# vim /web/webapp1/index.jsp 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html><head><title>JSP test2 page</title></head><body><% out.println("Welcom to test site,http:www.test2.com");%></body>
</html>

6)启动Tomcat,浏览器访问Tomcat2 server,测试http://192.168.136.22:8080/。

http {
···//省略内容#gzip  on;upstream tomcat_server {server 192.168.136.21:8080 weight=1;server 192.168.136.22:8080 weight=1;}server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;proxy_pass http://tomcat_server;}

2.2、Nginx服务器配置

        在Nginx服务器192.168.136.24上安装Nginx,反向代理两个Tomcat站点,并实现放在均衡。

1)关闭防火墙。

2)安装相关软件包。

[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel

 3)解压并安装Nginx。

[root@localhost ~]# groupadd www
[root@localhost ~]# useradd -g www www -s /bin/false
[root@localhost ~]# tar xf nginx-1.12.0.tar.gz
[root@localhost ~]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module
[root@localhost nginx-1.12.0]# make
[root@localhost nginx-1.12.0]# make install

4)配置nginx.conf。

http {
···//省略内容#gzip  on;upstream tomcat_server {  //配置负载均衡组server 192.168.136.21:8080 weight=1;server 192.168.136.22:8080 weight=1;}server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;proxy_pass http://tomcat_server;  //加上此配置代理设定好的tomcat_server负载均衡组}

5)测试Nginx配置文件是否正确。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

6)启动Nginx服务。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

7)查看Nginx服务进程。

[root@localhost ~]# ps aux | grep nginx
root      10476  0.0  0.0  20548   612 ?        Ss   15:16   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
www       10477  0.0  0.1  23080  1640 ?        S    15:16   0:00 nginx: worker process
root      69146  0.0  0.0 112724   988 pts/0    S+   16:56   0:00 grep --color=auto nginx

8)查看端口号及PID进程号。

[root@localhost ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10476/nginx: master 

2.3、测试负载均衡效果

1)打开浏览器访问:http://192.168.136.24/

2)不断刷新浏览器测试,可以看到由于权重相同,页面会反复在以下两个页面来回切换。

第一次访问,出现test1的测试页面;刷新后,第二次访问,则会出现test2的测试页面。这说明负载均衡群集搭建成功,已经可以在两个Tomcat server站点进行切换了。

相关文章:

部署Tomcat及其负载均衡

Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;Tomcat虽然和Apache或者Nginx这些Web服务器一样&#xf…...

C++ 类、结构体

C 类、结构体 类可以将变量、数组和函数完美地打包在一起。 类与结构体 类的定义&#xff1a; class Person {private:int age,height;double money;string books[100];public:string name;void say(){cout<<"Im"<<name<<endl;}int get_age(){…...

数据结构(三)堆和哈希表

目录 哈希表和堆什么是哈希表 &#xff1f;什么是堆 &#xff1f;什么是图 &#xff1f;案例一&#xff1a;使用python实现最小堆案例二 &#xff1a; 如何用Python通过哈希表的方式完成商品库存管理闯关题 &#xff08;包含案例三&#xff1a;python实现哈希表&#xff09; 本…...

李宏毅LLM——ChatGPT原理剖析

文章目录 Chat-GPT引言关键技术——预训练研究问题玩文字冒险游戏 ChatGPT原理剖析 Chat-GPT引言 直观感受&#xff1a;结果有模有样、每次输出结果都不同、可以追问、幻想出的答案误解&#xff1a;罐头回答、答案是网络搜索的结果真正做的事&#xff1a;文字接龙&#xff0c;…...

让Windows上vscode的C语言scanf函数可以读取中文字符

windows的默认字符集保存为GBK不要修改 区域设置–时钟和区域–区域–管理–更系统区域设置–&#xff08;不要勾选&#xff09;使用UTF-8。 查看验证当前字符集&#xff1a; cmdchcp 活动代码页: 936936就是简体中文GBK vscode的setting.json文件添加如下代码 点击左下角…...

Linux命令(3)

一. tr 对字符进行处理&#xff1a; tr 命令用于字符转换、替换和删除&#xff0c;主要用于删除文件中的控制符或进行字符串转换等。 将a转换成1 将小写字母转换成大写 压缩: tr -s 将a压缩成一个a 将空格压缩成一个 删除&#xff1a; tr -d 补集: 用字符串中的字符集的补…...

安卓MediaRecorder(3)音频采集编码写入详细源码分析

文章目录 前言音频采集音频初始化AudioRecord 分析AudioSource 采集到音频 音频编码音频编码后数据处理MPEG4Writer写入音频编码后数据到文件MPEG4Writer::Track 取编码后的音频编数据结语 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134896808 最新更新地…...

2024年网络安全竞赛—网络安全事件分析应急响应解析(包含FLAG)

网络安全事件分析应急响应 目录 网络安全事件分析应急响应 解析如下:...

FineBI实战项目一(22):各省份订单个数及订单总额分析开发

点击新建组件&#xff0c;创建各省份订单个数及订单总额组件。 选择自定义图表&#xff0c;将province拖拽到横轴&#xff0c;将cnt和total拖拽到纵轴。 调节纵轴的为指标并列。 修改横轴和纵轴的标题。 修改柱状图样式&#xff1a; 将组件拖拽到仪表板。 结果如下&#xff1a;…...

2024.1.16 调用tinyspline样条曲线拟合库时报 stack smashing detected,CMakeLists.txt中屏蔽该异常

在函数中调用第三方库api拟合样条曲线&#xff0c;函数中一切正常&#xff0c;可以打印所有数组变量&#xff0c;重复执行该函数&#xff0c;某一次函数return时报 stack smashing deteced &#xff08;unknown&#xff09; &#xff0c;原因可能是第三方库内部的函数有栈溢出风…...

Leetcode202快乐数(java实现)

今天分享的题目是快乐数&#xff1a; 快乐数的定义如下&#xff1a; 快乐数&#xff08;Happy Number&#xff09;是指一个正整数&#xff0c;将其替换为各个位上数字的平方和&#xff0c;重复这个过程直到最后得到的结果为1&#xff0c;或者无限循环但不包含1。如果最终结果为…...

50天精通Golang(第13天)

反射reflect 一、引入 先看官方Doc中Rob Pike给出的关于反射的定义&#xff1a; Reflection in computing is the ability of a program to examine its own structure, particularly through types; it’s a form of metaprogramming. It’s also a great source of confus…...

大数据 - Doris系列《三》- 数据表设计之表的基本概念

目录 &#x1f436;3.1 字段类型 &#x1f436;3.2 表的基本概念 3.2.1 Row & Column 3.2.2 分区与分桶 &#x1f959;3.2.2.1 Partition 1. Range 分区 2. List 分区 进阶&#xff1a;复合分区与单分区的选择 3.2.3 PROPERTIES &#x1f959;3.2.3.1 分片副本数 &#x1f…...

数据库mysql no.3

1.排序查询 order by 排序列表 【asc/desc】 排序列表&#xff1a;可以是单个字段、多个字段、表达式、函数、别名。 asc 升序 desc 降序 如果没有写那就是默认升序 2.常见函数 select 函数名&#xff08;&#xff09;&#xff1b; 定义&#xff1a;函…...

数据结构实战:变位词侦测

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;逐个比较法1、编写源程序2、代码解释说明&#xff08;1&#xff09;函数逻辑解释&#xff08;2&#xff09;主程序部分 3、运行程序&#xff0c;查看结果4、计算时间复杂度 &#xff08;二&#xff09;排序比较法1…...

C++核心编程之类和对象---C++面向对象的三大特性--多态

目录 一、多态 1. 多态的概念 2.多态的分类&#xff1a; 1. 静态多态&#xff1a; 2. 动态多态&#xff1a; 3.静态多态和动态多态的区别&#xff1a; 4.动态多态需要满足的条件&#xff1a; 4.1重写的概念&#xff1a; 4.2动态多态的调用&#xff1a; 二、多态 三、多…...

基于PyQT的图片批处理系统

项目背景&#xff1a; 随着数字摄影技术的普及&#xff0c;人们拍摄和处理大量图片的需求也越来越高。为了提高效率&#xff0c;开发一个基于 PyQt 的图片批处理系统是很有意义的。该系统可以提供一系列图像增强、滤波、水印、翻转、放大缩小、旋转等功能&#xff0c;使用户能够…...

vscode文件配置

lanuch.json {"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "cppdbg","request": "launch",// "program": "输入程序名称&#xff0c;例…...

C++学习笔记——SLT六大组件及头文件

目录 一、C中STL&#xff08;Standard Template Library&#xff09; 二、 Gun源代码开发精神 三、 实现版本 四、GNU C库的头文件分布 bits目录 ext目录 backward目录 iostream目录 stdexcept目录 string目录 上一篇文章&#xff1a; C标准模板库&#xff08;STL&am…...

Spring之AOP源码(二)

书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理&#xff0c;但是还没有涉…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...