ip_vs 的管理以及 keepalived + lvs 案例

ip_vs 的管理

ipvsadm 与 keepalived for lvs

在这里插入图片描述


ipvsadm 命令及参数介绍

部署和配置LVS服务会经常用到一些命令,如ipvsadm,可以使用“ipvsadm -help”命令查看使用帮助。

  • ipvsadm 命令的常用参数及其说明如下:

    # 添加虚拟服务器# 语法:ipvsadm -A [-t|u|f] [vip_addr:port] [-s:指定算法]--add-service, -A :增加虚拟vip服务--edit-service, -E :修改虚拟vip服务--tcp-service, -t service-address :TCP协议,service-address为host[:port]--udp-service, -u  service-address :UDP协议--fwmark-service, -f fwmark :防火墙标记,fwmark 是一个大于零的整数--scheduler, -s scheduler :指定调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq),缺省默认 wlc--delete-service, -D :删除虚拟vip服务
    # 添加|编辑虚拟vip服务
    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]# 参数:--add-service, -A :增加虚拟vip服务--edit-service, -E :修改虚拟vip服务--tcp-service, -t service-address :TCP协议。service-address为host[:port]--udp-service, -u service-address :UDP协议--fwmark-service, -f fwmark :防火墙标记,fwmark 是一个大于零的整数--scheduler, -s scheduler :指定调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq),缺省默认 wlc 
    # 删除虚拟vip服务
    ipvsadm -D -t|u|f service-address--delete-service, -D# 添加|编辑真实主机
    ipvsadm -a|e -t|u|f service-address -r server-address [options]--add-server, -a :添加真实主机--edit-server, -e :修改真实主机配置--tcp-service, -t service-address :TCP协议。service-address为host[:port]--udp-service, -u service-address :UDP协议--fwmark-service, -f fwmark :防火墙标记,fwmark 是一个大于零的整数--real-server, -r :指定后端realserver的IP--gatewaying, -g :DR模式--ipip, -i :TUN模式--masquerading, -m :NAT模式--weight, -w :指定权重
    # 删除真实主机
    ipvsadm -d -t|u|f service-address -r server-address--delete-server, -d :删除真实主机配置# 查看当前集群信息
    ipvsadm -ln--list, -L|-l :显示详细列表信息#  以下选项用于list命令--numeric, -n :不对ip地址进行dns查询,以数字形式输出信息--connection, -c :列出当前的IPVS连接。--timeout :列出超时--daemon :列出进程--stats :状态信息--rate :传输速率--thresholds :列出阈值--persistent-conn :坚持连接--sor :把列表排序--nosort :不排序--exact :单位# 清空所有记录
    ipvsadm -C--clear, -C :清空所有记录
    # 从stdin恢复规则
    ipvsadm -R--restore, -R
    # 将规则保存到stdout
    ipvsadm -S [-n]--save, -S
    # 显示详细列表信息
    ipvsadm -L|l [options]--list, -L|-l
    # 一个服务或所有服务中的计数器归零
    ipvsadm -Z [-t|u|f service-address]--zero, -Z
    # 设置连接超时值,单位s
    ipvsadm --set tcp_time tcpfin_time udp_time
    # 启动连接同步守护进程
    ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
    # 停止连接同步守护进程
    ipvsadm --stop-daemon state
    # 查看帮助
    ipvsadm -h
    
  • lvs 进程相关命令:

    # 查看下内核是否有加载 lvs
    lsmod | grep ip_vs
    # 加载ip_vs模块
    modprobe ip_vs
    # 查看ip_vs版本信息
    cat /proc/net/ip_vs# 安装 ipvsadm
    yum -y install ipvsadm 
    

案例

keepalived 通过配置文件管理 ip_vs

环境说明

  • LVS 给两台 nginx 做负载均衡
  • keepalived 做 lvs 高可用,同时做 Real-Server 健康检查,如果发现 Real-Server 的端口没开,就认为故障,从集群中剔除
  • 在 keepalived 配置文件内就能配置 LVS
主机名IP地址作用
lb01192.168.60.111lvs-master
lb02192.168.60.112lvs-backup
realserver-1192.168.60.121nginx
realserver-2192.168.60.122nginx
192.168.60.200VIP

主备服务器系统配置

主备服务器共同操作:

  • 安装所需应用,加载系统内核 ip_vs 模块

    ### 关闭firewalld防火墙
    [root@localhost ~]# systemctl stop firewalld.service
    ### 关闭selinux防火墙
    [root@localhost ~]# setenforce 0
    ### 安装所需应用
    [root@localhost ~]# yum -y install ipvsadm keepalived
    ### 加载ip_vs模块
    [root@localhost ~]# modprobe ip_vs
    ### 查看ip_vs版本信息
    [root@localhost ~]# cat /proc/net/ip_vs
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
    
  • 编写 lvs 健康检查脚本

    vi /usr/libexec/keepalived/lvs_check.sh
    

    脚本内容:

    #!/bin/baship=$(hostname -I | awk '{print $1}')
    dt=$(date +'%Y%m%d %H:%M:%S')
    echo "$0--${ip}--${dt}" >> /tmp/kp.log# 检查 LVS 的状态
    if [ -e /proc/net/ip_vs ]; thenif [[ $(cat /proc/net/ip_vs | grep TCP) != '' ]];then exit 0		# 正常状态else echo "${ip}--${dt}: LVS is not running. Take necessary actions" >> /tmp/kp.logexit 1		# 异常状态fi
    else echo "${ip}--${dt}: LVS is not running. Take necessary actions" >> /tmp/kp.logexit 1
    fi
    

    给脚本加执行权限

    chmod +x /usr/libexec/keepalived/lvs_check.sh
    

主服务器 keepalived 配置文件

[root@localhost ~]#cd /etc/keepalived/           #配置文件存放目录
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak   #备份一份配置文件
[root@localhost keepalived]# vi keepalived.conf
......
global_defs {			### 定义全局参数smtp_server 127.0.0.1       ### 修改,邮件服务指向本地smtp_connect_timeout 30     ### 连接超时时间router_id LVS_01          	### 修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02#vrrp_skip_check_adv_addr    ### 这四行注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接#vrrp_strict#vrrp_garp_interval 0#vrrp_gna_interval 0
}
# 定义 lvs 健康检查脚本
vrrp_script lvs_check {script "/usr/libexec/keepalived/lvs_check.sh"interval 1
}vrrp_instance VI_1 {			### 定义VRRP热备实例参数state MASTER            	### 修改,指定热备状态,主为MASTER,备为BACKUPinterface ens33         	### 修改,指定承载vip地址的物理接口virtual_router_id 10    	### 修改,指定虚拟路由器的ID号,每个热备组保持一致	#nopreempt					### 如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreemptpriority 100         		### 修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90advert_int 1				### 通告间隔秒数(心跳频率)authentication {			### 定义认证信息,每个热备组保持一致auth_type PASS			### 认证类型auth_pass abc123    	### 修改,指定验证密码,主备服务器保持一致}virtual_ipaddress {			### 指定群集vip地址192.168.60.200}# 调用 lvs 健康检查脚本track_script {lvs_check}
}################## LVS配置 ##############            
# 添加虚拟服务器
# 相当于 ipvsadm -A -t 192.168.60.200:8080 -s wrr
virtual_server 192.168.60.200 8080 {  ### 修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数delay_loop 6					### 健康检查的间隔时间(秒)lb_algo rr						### 指定调度算法,轮询(rr)lb_kind DR       				### 修改,指定群集工作模式,直接路由(DR)persistence_timeout 0			### 连接保持时间(秒)protocol TCP					### 应用服务采用的是 TCP协议# 添加后端realserver# 相当于 ipvsadm -a -t 192.168.0.100:8080 -r 192.168.60.121:8080 -w 1real_server 192.168.60.121 8080 {  ### 修改,指定第一个真实的物理节点的地址、端口weight 1					# 节点的权重	TCP_CHECK {                 ### 使用 TCP_CHECK 健康检查方式connect_port 8080		# 添加检查的目标端口connect_timeout 3		# 添加连接超时(秒)nb_get_retry 3			# 添加重试次数delay_before_retry 3	# 添加重试间隔}}real_server 192.168.60.122 8080 {	# 添加第二个真实的物理节点的地址、端口weight 1TCP_CHECK {connect_port 8080connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}

备服务器 keepalived 配置文件

[root@localhost ~]#cd /etc/keepalived/           #配置文件存放目录
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak   #备份一份配置文件
[root@localhost keepalived]# vim keepalived.conf
......
global_defs {smtp_server 127.0.0.1 smtp_connect_timeout 30router_id LVS_02
}vrrp_script lvs_check {script "/usr/libexec/keepalived/lvs_check.sh"interval 1
}vrrp_instance VI_1 {state BACKUP interface ens33  virtual_router_id 10  	#nopreempt		priority 90    advert_int 1	authentication {	auth_type PASS			auth_pass abc123    	}virtual_ipaddress {			192.168.60.200}track_script {lvs_check}
}virtual_server 192.168.60.200 8080 { delay_loop 6					lb_algo rr						lb_kind DR    persistence_timeout 0			protocol TCP					real_server 192.168.60.121 8080 {  weight 1					TCP_CHECK {                 connect_port 8080		connect_timeout 3		nb_get_retry 3			delay_before_retry 3	}}real_server 192.168.60.122 8080 {weight 1TCP_CHECK {connect_port 8080connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}

启动 keepalived

  • 修改过配置文件之后,主备服务器重启 keepalived 服务

    systemctl restart keepalived
    
  • 使用 ip add 命令检查 vip 是否生成

    在这里插入图片描述

    在这里插入图片描述

  • 查看 lvs

    真实服务器的服务启动,lvs 就会添加规则;服务一关闭,lvs 就会去掉规则

    [root@lvs1 keepalived]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.60.200:8080 wrr-> 192.168.60.121:8080           Route   1      0          0         -> 192.168.60.122:8080           Route   1      0          0  
    
  • 修改 lvs 的超时时间

    # 查看 lvs 的超时时间
    [root@DR1 keepalived]# ipvsadm -L --timeout
    Timeout (tcp tcpfin udp): 900 120 300
    

    900 120 300 这三个数值分别是 TCP TCPFIN UDP 的默认超时时间,也就是说一条 tcp 的连接经过 lvs 后,lvs 会把这台记录保存15 分钟。因为这个时间比较长,所以如果不做修改的话,在使用浏览器测试 lvs 的 dr 轮询效果时会发现轮询现象并没有发生,测试时可以将此数值调整小(单位是 秒)

    [root@DR1 ~]# ipvsadm --set 1 2 1
    

    注意:lvs 超时时间虽然调小了,但依然是 秒 级别的,浏览器连续点击不会实现连续跳转,至少需隔 1 秒再点才会出现跳转


真实服务器部署 nginx

  1. 安装软件

    # 安装nginx以及拓展源
    yum install epel-release -y
    yum install -y nginx
    
  2. Nginx 配置 web 站点

    #web1
    [root@nginx1 ~]# vi /etc/nginx/conf.d/web.conf 
    server{listen 8080;root         /usr/share/nginx/html;index test.html;
    }[root@nginx1 ~]# echo "<h1>This is web1</h1>"  > /usr/share/nginx/html/test.html
    
    #web2
    [root@nginx2 ~]# vi /etc/nginx/conf.d/web.conf 
    server{listen 8080;root         /usr/share/nginx/html;index test.html;
    }[root@nginx2 ~]# echo "<h1>This is web2</h1>"  > /usr/share/nginx/html/test.html
    
  3. 启动 Nginx

    nginx -t
    nginx
    

真实服务器绑定 VIP

  • 编写脚本

    vi rs.sh
    

    脚本内容

    #!/bin/bash
    #description: Config realserver
    VIP=192.168.60.200
    netmask=255.255.255.255#/etc/rc.d/init.d/functionscase "$1" in
    start)# 添加 vip 到循环网卡(临时生效)ip addr add $VIP brd $netmask dev lo label lo:0# 添加 vip 到路由(临时生效)ip route add $VIP dev lo:0# 设置真实服务器的lo接口不做ARP应答,使得各个接口只对本接口上的地址进行响应#echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore#echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announcesysctl -p >/dev/null 2>&1echo "RealServer Start OK";;
    stop)ip addr del $VIP brd $netmask dev lo label lo:0ip route del $VIP dev lo:0#echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore#echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "RealServer Stoped";;
    *)echo "Usage: $0 {start|stop}"exit 1
    esacexit 0
    
  • 执行脚本

    sh rs.sh start
    

拓展

  • 永久绑定 VIP

    [root@web02 network-scripts]# cd /etc/sysconfig/network-scripts
    [root@web02 network-scripts]# cp ifcfg-lo ifcfg-lo:1
    [root@web02 network-scripts]# vi ifcfg-lo:1
    DEVICE=lo:1
    IPADDR=192.168.245.166
    NETMASK=255.255.255.255
    ONBOOT=yes
    NAME=loopback
    
  • 抑制 arp 解析

    #方法1:
    cat >> /etc/sysctl.conf << EOF
    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    #net.ipv4.conf.lo.arp_ignore=1
    #net.ipv4.conf.lo.arp_announce=2
    EOFsysctl -p#方法2:
    #echo  "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    #echo  "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo  "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo  "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    

    注:

    • arp_ignore 为 1 时:只响应目的 IP 地址为接收网卡上的本地地址的 arp 请求

    • arp_announce 为 2 时:只向该网卡回应与该网段匹配的 ARP 报文

    • 回环网卡 lo 和网卡 ens33 是物理隔离的,不在一个网段,在回环网卡上加一个 IP,默认设置下(net.ipv4.conf.lo.arp_ignore=0)是不会把回应 ens33 所在局域网的arp广播的。

      所以 net.ipv4.conf.lo.arp_ignore=1 和 /proc/sys/net/ipv4/conf/lo/arp_announce=1 实际是无效设置。

    • net.ipv4.conf.all.arp_announce 参数也可以不设置,应为在这个架构中真实服务器不发 arp 广播,只接收和回应 arp 广播。


验证

  • 在非 keepalived master 主机(即拿到 vip 的主机)使用 curl 命令测试,而是在其他主机或者用浏览器测试
  • 注意:lvs 应对高并发负载均衡,访问是比较少时,并不能像 nginx 那样 1:1 轮询。在浏览器连续点击不会实现连续跳转,需隔 lvs 的超时时间再点才会出现跳转

参考

  • LVS的介绍与使用
  • LVS详解
  • LVS+Keepalived
  • [LVS+Keepalived 构造高可用负载均衡集群](

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

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

相关文章

PLC从HTTP服务端获取JSON文件,解析数据到寄存器

智能网关IGT-DSER集成了多种PLC协议&#xff0c;方便实现各种PLC与HTTP服务端之间通讯。通过网关的参数配置软件绑定JSON文件的字段与PLC寄存器地址&#xff0c;配置URL&#xff0c;即可采用POST命令&#xff0c;将JSON文件提交给HTTP的服务端&#xff1b; 服务端有返回的JSON&…

【JavaEE】认识网络的工作原理

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

66 C++对象模型探索。C++编译器在什么时候给我们创建默认的构造函数?

一 前提&#xff0c;关于C编译器给我们生成 默认构造函数 的错误认知 传统知识认为&#xff1a;如果在一个类中&#xff0c;我们没有定义任何的构造函数&#xff0c;那么编译器会为我们隐式自动定义一个默认的构造函数&#xff0c;我们称这种构造函数为 "合成的默认构造函…

德思特方案|EMI兼容测试方案——匹配不同测试标准,准确高效!

方案背景 近场测试非常适合产品开发阶段辐射发射的EMI预兼容测试。在EMC测试中&#xff0c;进行辐射发射测试时&#xff0c;通常天线离被测物EUT很远&#xff0c;进行的都是远场测量。标准的远场辐射发射测试&#xff0c;可以准确定量的告诉我们被测件是否符合相应的EMC/EMI标…

网络工程师:新兴科技基础知识面试题(十三)

112.对区块链的理解与看法&#xff1f; 区块链是一种分布式的、公开透明的数据库技术&#xff0c;以区块的形式将交易数据进行链式连接。它通过去中心化的方式&#xff0c;将数据存储和交易验证的权力分散给网络中的多个节点&#xff0c;提供了一种安全、可信的数据交换和存储方…

case语句、case分支应用示例、函数及中断控制、字符串截取、替换、删除

1 案例1&#xff1a;中断及退出 1.1 问题 本案例要求编写两个Shell脚本&#xff0c;相关要求如下&#xff1a; 从键盘循环取整数&#xff08;0结束&#xff09;并求和&#xff0c;输出最终结果 1.2 方案 通过break、continue、exit在Shell脚本中实现中断与退出的功能。 e…

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化 前言 在上…

vue组件间通信

Vue组件之间通信方式有哪些 一、父子组件通讯 1、props&#xff0c;emit 父组件可以通过props给子组件传递变量。子组件可以通过emit派发自定义事件&#xff0c;使父组件可以获得事件函数传递过来的形参。 2、$parent、$children、ref 父组件可以通过 c h i l d r e n 获取…

imgaug库图像增强指南(32):塑造【雪景】效果的视觉魔法

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

我的项目管理工具TaskSaas

这次使用的技术是Python的Django框架,以及Django框架自带的前端模版语法. Open-TaskSaas: 项目、学习管理工具 项目已经开源,但我在此基础上已经开始更新Vue3Springboot版本,也希望喜欢开源和学习的小伙伴共同加入进来! 基本的样式,操作,都从线上环境可以看得到了! 首页 测…

Django(九)

1. 用户登录-Cookie和Session 什么是cookie和session&#xff1f; 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接&#xff1a;一次请求响应之后断开连接&#xff0c;再发请求重新连…

PCB导线阻抗概念

1. 计算公式 https://baijiahao.baidu.com/s?id1750340479004609055&wfrspider&forpc Z087/SQRT(εr1.41)ln[(5.98h)/(0.8wt)] 常规来说阻抗与介电常数成反比,与介质层厚度成正比,与线宽成反比,与铜厚成反比。 Z0&#xff1a;印刷导线的特性阻抗 εr&#xff1a;绝缘…

RK3568笔记十:Zlmediakit交叉编译

若该文为原创文章&#xff0c;转载请注明原文出处。 编译Zlmediakit的主要目的是想实现在RK3568拉取多路RTPS流&#xff0c;并通过MPP硬解码&#xff0c;DRM显示出来。为了实现拉取多路流选择了Zlmediakit,使用FFMEPG也可以&#xff0c;在RV1126上已经验证了可行性。 一、环境…

CPU和GPU的工作原理及区别

CPU&#xff08;Central Processing Unit&#xff09;和GPU&#xff08;Graphics Processing Unit&#xff09;是计算机系统中的两种主要处理器类型&#xff0c;它们在工作原理和用途上有一些显著的区别。 CPU&#xff08;中央处理器&#xff09; 工作原理&#xff1a; 通用…

CEF框架中的一些宏定义(一):CHECK DCHECK

文章目录 CHECK & DCHECKDCHECK_IS_ON 日志相关COMPACT_GOOGLE_LOG_FATALLogMessageLOG_STREAM(FATAL)LAZY_STREAMLogMessageVoidify 在CEF框架中&#xff0c;有很多的宏定义&#xff0c;有必要拿出来说一说&#xff0c;在阅读源码的时候更好的理解。 CHECK & DCHECK …

PyTorch深度学习实战(31)——生成对抗网络(Generative Adversarial Network, GAN)

PyTorch深度学习实战&#xff08;31&#xff09;——生成对抗网络 0. 前言1. GAN2. GAN 模型分析3. 利用 GAN 模型生成手写数字小结系列链接 0. 前言 生成对抗网络 (Generative Adversarial Networks, GAN) 是一种由两个相互竞争的神经网络组成的深度学习模型&#xff0c;它由…

Flask框架小程序后端分离开发学习笔记《3》客户端向服务器端发送请求

Flask框架小程序后端分离开发学习笔记《3》客户端向服务器端发送请求 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 一、为什么请求数据需要先编码 #构造一个HTTP请求 http_request GET / HTTP/1.1\r\nhost:{}\r\n\r\n.for…

大语言模型系列-ELMo

文章目录 前言一、ELMo的网络结构和流程二、ELMo的创新点总结 前言 在前文大语言模型系列-word2vec已经提到word2vec的缺点&#xff1a; 为每个词汇表中每个分词静态生成一个对应的词向量表示&#xff0c;没有考虑到语境&#xff0c;因此无法无法处理多义词 ps&#xff1a;先…

Python Web 开发之 Flask 入门实践

导语&#xff1a;Flask 是一个轻量级的 Python Web 框架&#xff0c;广受开发者喜爱。本文将带领大家了解 Flask 的基本概念、搭建一个简单的 Web 项目以及如何进一步扩展功能。 一、Flask 简介 Flask 是一个基于 Werkzeug 和 Jinja2 的微型 Web 框架&#xff0c;它的特点是轻…

JAVA RPC Thrift基操实现与微服务间调用

一、Thrift 基操实现 1.1 thrift文件 namespace java com.zn.opit.thrift.helloworldservice HelloWorldService {string sayHello(1:string username) }1.2 执行命令生成Java文件 thrift -r --gen java helloworld.thrift生成代码HelloWorldService接口如下 /*** Autogene…