Nginx分布式框架

nginx

是一个高性能的HTTP和反向代理web服务器。

提供的服务:

  • 动静分离(web 服务)
  • 负载均衡 (反向代理)
  • web 缓存
  • 内存少,并发能力强(支持50,000 个并发)

安装

下载地址:http://nginx.org/en/download.html

  1. 下载完上传Linux服务器上,一般安装在/usr/local下,进行解压

    tar -zxvf nginx-1.18.0.tar.gz
    
  2. 进行配置,在nginx根目录下执行

    # 1.安装编译工具文件库
    yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
    
    # 方式1:
    # 2.使用默认配置
    ./configur
    
    # 3.然后回车,进行编译
    make
    
    # 4.然后回车,安装
    make install
    
    # 方式2:注意:如果自定义安装
    # 1. 创建nginx临时目录
    mkdir -p /var/temp/nginx
    
    # 2. 进入nginx安装目录,指定配置文件
    ./configure \
    # 安装在哪个目录下
    --prefix=/usr/local/nginx/nginx \
    --conf-path=/usr/local/nginx/nginx.conf  \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi \
    --with-http_stub_status_module \
    --with-http_ssl_module 
    # --with-http_ssl_module 是配置支持https
    
    # 3.编译、安装
    make
    make install
    
  3. 查找安装路径:

    whereis nginx
    # 默认在/usr/local/nginx
    

    启动Nginx,默认是80端口,在浏览器输入服务器IP地址,就能访问Nginx默认页面,说明安装成功。

卸载Nginx:

# 关闭nginx进程
./nginx -s stop
rm -rf /user/local/nginx
make clean

常用命令

启动/停止/退出nginx:

# 启动
cd /usr/local/nginx/sbin/
./nginx
start nginx
# 指定配置文件启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
或者
./nginx -c /usr/local/nginx/conf/nginx.conf

# 停止
./nginx -s stop

# 安全退出,优雅退出
./nginx -s quit

# 重新加载配置文件
./nginx -s reload

# 查看配置文件是否错误
./nginx -t

# 查看nginx进程
ps aux|grep nginx

设置nginx开机启动:

vim /etc/rc.local
然后在底部增加
/usr/local/nginx/sbin/nginx

其他命令:

# 开启防火墙
service firewalld start
# 关闭防火墙
service firewalld stop
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp

Nginx目录结构有哪些:

/usr/local/nginx
├── client_body_temp
├── conf                             # Nginx所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件
│   ├── fastcgi_params               # fastcgi的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi相关参数文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi临时数据目录
├── html                             # Nginx默认站点目录
│   ├── 50x.html                     # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx日志目录
│   ├── access.log                   # 访问日志文件
│   ├── error.log                    # 错误日志文件
│   └── nginx.pid                    # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                       # 临时目录
├── sbin                             # Nginx命令目录
│   └── nginx                        # Nginx的启动命令
├── scgi_temp                        # 临时目录
└── uwsgi_temp                       # 临时目录

核心配置文件结构

配置文件默认是放在/usr/local/nginx/conf/nginx.conf,配置文件中默认有三大块:全局块、events块、http块。

# 一般几个CPU,配置几个工作线程
worker_processes  1;

events {
   # 一个线程最大的连接数1024个
    worker_connections  1024;
}

http {
    # 在配置文件 conf/mime.types 下有配置,文件后缀对应的打开匹配文件后缀的配置
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

全局块

user指令:

用于配置运行Nginx服务器的worker进程的用户和用户组。我们最开始创建Nginx时,执行./configure --user=user --group=group,在配置文件添加

user 用户名;

然后再Linux命令行,创建一个用户

useradd 用户名
user 用户名
# 然后该用户有/home/用户名/`目录下访问权限,其他目录没有权限

work process指令

nginx是进程模型,分为主进程、工作进程。

master_process:用来指定是否开启工作进程。

worker_processes:配置Nginx生成工作进程的数量,一般与CPU的内核数-1数保存一致。

# 设置工作进程
worker_processes  2;

events块

accept_mutex指令:

配置:accept_mutex on|off ;用来设置Nginx网络连接序列化。

worker_connections指令:

默认是 worker_commections 512;用来配置单个worker进程最大的连接数;

(单个worker进程最大的连接数 * N个worker线程),这个值不能大于操作系统支持打开的最大文件句柄数量。(Linux一般是65535)

# 修改操作系统支持打开的最大文件句柄数量,临时修改
ulimit -HSn 2048
# 永久修改
vi /etc/security/limits.conf

http块

include指令:

包含和导入外部文件,进行模块化的划分。

include mime.types;
default_type application/octet-stream;

sendfile指令:

启用文件的高效传输,打开有利于文件传输的性能。

sendfile   on;  # 启用高效传输,与tcp_nopush联合使用
tcp_nopush on;  # 当请求累积一定大小的时候,在进行发送

keepalive_requests指令:

用来设置一个keep-alive连接使用的次数,客户端连接服务的超时时间。

gzip指令:

开启它有利于文件和请求数据的传输。

gzip on

server块:

listen指令:

用来配置监听端口。

server_name指令:

用来设置虚拟主机服务名称。

server {
	listen 80;
	server_name www.xx1.cn www.xx2.cn;
	# 可以配置多个,也可以通配符进行配置 *.itcast.cn www.itcast.* 注意*只能在首尾部分
}

location指令:

用来设置请求的URI。

server {
	...
	server_name xxx.cn
	# 可以在location后面加=(精确匹配)~(支持正则)~*(支持正则,支持大写)
	location /abc{
		default_type text/plain;
		return 200 "access success";
	}
}
# 例子:请求:http://127.0.0.1/bbs,会匹配这里,页面存放路径在html/bbs目录下
location /bbs {
       root html;
}
# 可以模糊匹配,动静分离这里就是模糊匹配

error_page指令:

设置网站的错误页面。

server {
	error_page 404 http://www.404.cn;
}
或者
server{
	error_page 404 /50x.html;
	error_page 500 502 503 504 /50x.html;
	location =/50x.html{
		root html;
	}
}

gzip_static指令:

解决Gzip和sendfile共存问题,需要添加ngx_http_gzip_static_module模块,才能使用gzip_static指令。

# 1.查询当前Nginx的配置参数
nginx -V
# 2.清楚编译内容
cd /root/nginx/core/nginx-xxx
make clean
# 3.使用configure来配置参数
./configure (...之前的内容) --with-http_gzip_static_module
# 4.进行编译
make
# 5.将objs目录下的nginx二进制执行文件移动到nginx安装目录下的sbin下
mv objs/nginx /usr/local/nginx/sbin
# 6.执行更新命令
make upgrade
# 7.在配置文件http块下添加
gzip_static on

proxy块:

反向代理模块

proxy_pass指令:

令用来设置被代理服务器地址。

proxy_set_header指令:

该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后 将新的请求头发送给代理的服务器。

server {
	listen 8080;
	server_name localhost;
	# 设置DNS的IP,用来解析proxy_pass域名
	resolver 8.8.8.8;
	location /server {
		proxy_pass http://192.168.xx.xx:8080/;
		proxy_set_header username TOM;
	}
}

配置文件案例:

基本部署:

# 全局块
# 配置允许运行Nginx工作进程的用户和用户组
user www;
# 一般是CPU核数-1
worker_processes 2; 

# 配置Nginx服务器运行对错误日志存放的路径
error_log logs/error.log;
pid logs/nginx.pid;

# 全局块
events{
	accept_mutex on;
	multi_accept on;
	# 设置Nginx的worker进程最大的连接数
	worker_connections 1024;
}
# http块
http{
	include mime.types;
	default_type application/octet-stream;
	# 配置允许使用sendfile方式运输,开启高效的文件传输
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	# 配置连接超时时间
	keepalive_timeout 65;
	
	# Gzip压缩功能配置
	include /home/www/gzip/nginx_gzip.conf;
	# 配置请求处理日志格式
	log_format server1 '===>server1 access log';
	# log_format server2 '===>server2 access log';
	
	# server块 开始 #
	include /home/www/conf.d/*.conf;
	# server块 结束 #

}

server1的配置文件

server{
	listen 8081;
	# 设置虚拟主机服务名称,可以用域名,多个空格隔开,也可以通配符"*“例子:*.good.cn
	server_name localhost;
	# 配置请求处理日志存放路径
	access_log /home/www/myweb/server1/logs/access.log server1;
	
	location /server1/location1{
		root /home/www/myweb;
		index server1.html;
	}
	location /server1/location2{
		root /home/www/myweb;
		index server2.html;
	}
	# 配置错误页面转向
	location = /404.html {
		root /home/www/myweb;
		index 404.html;
	}
}

nginx_gzip.conf的配置文件

# 开启gzip功能
gzip on;
# 压缩源文件类型,例 application/javascript application/html;在mine.types里查看。
gzip_types *; 
# 压缩级别 1-9
gzip_comp_level 6; 
# 进行压缩响应页面的最小长度,小于这个数不进行压缩
gzip_min_length 1024k;
# 缓存空间大小,使用默认就好
gzip_buffers 4 16K; 
# 指定压缩响应所需要的最低HTTP请求版,使用默认就好
gzip_http_version 1.1;
# 往头信息中添加压缩标识,默认是off
gzip_vary on;
# 对IE6以下的版本都不进行压缩
gzip_disable "MSIE [1-6]\.";

解决跨域问题:

用add_header指令,该指令可以用来添加一些头信息

location /xxx{
	add_header ‘Access-Control-Allow-Origin’ *;
	add_header ‘Access-Control-Allow-Credentials’ 'true';
	add_header ‘Access-Control-Allow-Methods’ GET,POST,PUT,DELETE;
	add_header ‘Access-Control-Allow-Headers’ *;
	root /home/www/myweb;
	index server1.html;
}

解决静态资源防盗链:

用valid_referers指令,如果在添加上域名或者IP地址,如果该值为1就返回403

location /xxx {
	valid_referers none blocked www.baidu.* 127.0.0.1;
	if ($invalid_referer){
		# 返回403
		return 403
		# 如果让该图片显示其他默认图片
		rewrite ^/ /images/图片名.png break;
	}
	root /usr/local/nginx/html;
}

# 如果不算这个域名,会重定向403
valid_referers *.goodysr.cn
if($invalid_referer){
	return 403
}

Rewrite域名跳转:

访问xxx1、xxx2域名 会跳转到zong的域名下。
标记说明:
1、last:本条规则匹配玩成后,继续向后新的location URL规则,一般用在server和if中。
2、break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中。
3、redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
4、permanent:返回301也就重定向,浏览器地址栏会现实跳转后的URL地址

server {
	listen 80;
	server_name www.xxx1.com www.xxx2.cn;
	rewrite ^(.*) http://www.zong.cn$1;
	# 也可以某个路径下进行跳转,没有$1,代表请求后面的参数,不会携带
	location /user {
		rewrite ^/user(.*)$ http://www.user.cn$1;
	}
}

配置SSL:

步驟1:生成证书

1.使用阿里云等平台购买: 或者使用openssl

购买证书,然后创建证书,进行绑定域名,然后审核通过,下载证书。

在服务器上某文件下(nginx/conf下),创建cert目录,存放所下载的证书文件。

server {
	listen 80;
	server_name 域名;
	# 将http请求重定向https上
	rewrite ^(.*)$ https://$host$1;
	location / {
		root html;
		index index.html index.htm;
	}
}
server {
	listen 443 ssl;
	server_name 域名;
	root html;
	index index.html index.htm;
	# 证书文件
	ssl_certificate cert/xxx.pem;
	ssl_certificate_key cert/xxx.key;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 5m;
	# 加密规则
	ssl_ciphers HIGH:!aNULL:!MD5;
	# 表示使用TLS协议类型
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2
	ssl_prefer_server_ciphers on;
	location / {
		root html;
		index index.html index.htm;
	}
}

配置负载均衡

负载均衡状态 :

  • down 不参与负载均衡
  • backup 备份服务器,不执行,当主服务挂的时候才执行
  • max_fails 允许请求失败的次数,max_fails =3
  • fail_timeout 经过max_fails失败后,服务暂停时间,fail_timeout=15
  • max_conns 限制最大的接收连接数,当这台机器最大并发是100,也就是值为100

负载均衡策略:

  • 轮询 默认方式

  • weight 权重方式

  • ip_hash 根据ip分配方式 ,这样可以解决session不共享问题

    upstream backend{
    	ip_hash;
    	server 127.0.0.1:9091;
    	server 127.0.0.1:9092;
    }
    
  • least_conn 根据最少连接方式 ,适合请求处理时间长短不一造成服务器过载。

  • url_hash 根据URL分配方式 ,hash &request_uri;

  • fair 根据响应时间方式

# 负载均衡配置
upstream backend {
	server 127.0.0.1:9091 down;
	server 127.0.0.1:9092 max_conns=100 weight=1;
	server 127.0.0.1:9093 weight=2;
}
upstream backend2{
	hash &request_uri;
	server 127.0.0.1:9091;
	server 127.0.0.1:9091;
}
server {
    listen       80;
    server_name  localhost;
    location / {
        #root   html;
        #index  index.html index.htm;
		proxy_pass http://backend;
    }	
    location /backend2/ {
		proxy_pass http://backend2;
	}
}

配置缓存:

http{
	# 设置缓存根目录 levels缓存规则 keys_zone缓存名,缓存大小,1m=8000连接地址
 	# inactive缓存多久会被情况 max_size缓存空间最大空间
	proxy_cache_path /usr/local/cache levels=2:1 keys_zone=缓存名:200m inactive=1d max_size=20g;
	
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen 8080;
		server_name localhost;
		location / {
			# 设置不缓存 如果是js文件不进行缓存
			if ($request_uri ~ /.*\.js$){
				set $nocache 1;
			}
			proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
			proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
			proxy_cache 缓存名;
			proxy_cache_key $scheme$proxy_host$request_uri;
			# 当请求为5次才进行缓存
			proxy_cache_min_uses 5;
			# 当缓存状态码是200 ,缓存时长5天
			proxy_cache_valid 200 5d;
			# 当缓存状态码是404,缓存时长30s
			proxy_cache_valid 404 30s;
			proxy_cache_valid any 1m;
			add_header nginx-cache"$upstream_cache_status";
			proxy_pass http://backend;
		}
	}
}

删除对应的缓存目录:

rm -rf /usr/local/proxy_cache/......

动静分离:

upstream webservice{
	# tomcat地址
	server 192.168.10.xxx:8080;
}
server {
	listen 80;	
	server_name localhost;
	# 动态资源
	location /demo {
		proxy_pass http://webservice;
	}
	# 静态资源
	location ~/.*\.(png|jpg|gif|js){
		root html/web; # 静态文件地址
		gzip on;
	}
	location / {
		root html/web;
		index index.html index.htm;
	}
}

搭建高可用Nginx集群:

准备两台Nginx机器,需要在这两台机器安装Keepalived,通过 VRRP 协议实现高可 用功能。

安装Keepalived

步骤1:从官方网站下载keepalived,官网地址 https://keepalived.org/
步骤2:将下载的资源上传到服务器 
keepalived-2.0.20.tar.gz
步骤3:创建keepalived目录
mkdir keepalived
步骤4:将压缩文件进行解压缩,解压缩到指定的目录
tar -zxf keepalived-2.0.20.tar.gz -C keepalived/
步骤5:对keepalived进行配置,编译和安装
cd keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install

配置文件

一般在 /etc/keepalived/keepalived.conf ,我们进行配置

global_defs {
	# 当keepalived发送切换时需要发email给具体的邮箱地址
	notification_email {
		xx1@xx1.com
		xx2@xx2.com
	}
	# 设置发件人的邮箱信息
	notification_email_from yy@xx3.com
	# 指定smpt邮箱服务地址
	smtp_server 192.168.200.1
	smtp_connect_timeout 30
	# 服务器的一个标识 A机器
	router_id keepalivedA
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}
vrrp_instance VI_1 {
	# 两个值可选 MASTER主机 BACKUP从机
	state MASTER
	# 非抢占,这个参数只能用于state为backup
	# 所以我们把state都设置成backup 让其通过priority来竞争,实现主机和从机
	nopreempt
	interface ens33
	virtual_router_id 51
	# 优先级高的将成为主机
	priority 100
	advert_int 1
	authentication {
		# 认证方式
		auth_type PASS
		# 指定认证使用的密码,最多8位
		auth_pass 1111
	}
	virtual_ipaddress {
		# 虚拟IP地址设置虚拟IP地址
		192.168.200.222
	}
}

启用keepalived

cd /usr/local/sbin
./keepalived

编写脚本实现自动切换

  1. 在keepalived配置文件中添加对应的配置像

    gloval_defs{
    	....
    }
    
    # ck_n为脚本名称
    vrrp_script ck_n{
    	script "脚本位置"
    	interval 3 #执行时间间隔
    	weight -20 #动态调整vrrp_instance的优先级
    }
    
    vrrp_instance VI_1 {
    	...
    	virtual_ipaddress {
    		192.168.200.111
    	}
    	# 使用Shell脚本
    	track_script {
    		ck_n
    	}
    }
    
  2. 编写脚本

    内容:监听nginx运行状态,如果nginx启动失败,尝试再次启动,如果启动失败,关掉keepalived进程。

    #!/bin/bash
    num=`ps -C nginx --no-header | wc -l`
     if [ $num -eq 0 ];then
     /usr/local/nginx/sbin/nginx
     sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
     killall keepalived
    fi
    fi
    
  3. 为脚本文件设置权限

    chmod 755 ck_nginx.sh
    

常见问题

启动失败找不到pid文件

解决:

mkdir -p /var/run/nginx/
# 指定配置文件进行重启
nginx -C /usr/local/nginx/conf/nginx.conf
# 重启
nginx -s reload

配置环境变量:

vim /etc/profile
# 在文件末尾加上
export NGINX_HOME=/usr/local/nginx
export PATH=$NGINX_HOME/sbin:$PATH

设置开机自动启动:

vim /lib/systemd/system/nginx.service
# 在文件添加
[Unit]
#描述服务
Description=nginx
#描述服务类别
After=network.target
 
#服务运行参数的设置,注意【Service】的启动、重启、停止命令都要用绝对路径
[Service]
#后台运行的形式
Type=forking
#服务具体运行的命令
ExecStart=/usr/local/nginx/sbin/nginx
#重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/nginx/sbin/nginx -s quit
#表示给服务分配独立的临时空间
PrivateTmp=true
 
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target

# 然后 修改文件权限
chmod 755 /usr/lib/systemd/system/nginx.service
# 设置开机自启动
systemctl enable nginx.service

防火墙的配置:

---- 常用防火墙配置
# 查看防火墙状态
systemctl status firewalld
# 开启防火墙
systemctl start firewalld
# 开机启动
systemctl enable firewalld
# 开机关闭
systemctl disable firewalld

-- 设置对应开放的端口号
# 查询打开的端口有哪些
firewall-cmd --zone=public --list-ports
# 关闭端口9002
firewall-cmd --zone=public --remove-port=9002/tcp --permanent
# 重新载入一下防火墙设置,使设置生效
firewall-cmd --reload

-- 设置nginx可对外网访问,服务端的tomcat不对外网方法,他们可以内网访问
# 允许某ip访问9002端口 ip地址一般是nginx的ip地址
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.27.0.45" port protocol="tcp" port="9002" accept"
# 移出某ip访问9002端口 ip地址一般是nginx的ip地址
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="172.27.0.45" port protocol="tcp" port="9002" accept"
# 重新载入一下防火墙设置,使设置生效
firewall-cmd --reload
# 查看已设置规则
firewall-cmd --zone=public --list-rich-rules
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建一个Java分布式框架需要考虑以下几个步骤: 1.确定架构:根据应用场景和需求选择适合的架构,如客户端-服务器模型、对等网络模型、集群模型等。 2.选择通信协议:根据架构设计通信协议,需要定义数据格式、数据传输方式、传输协议等。 3.实现分布式算法:根据应用场景和需求实现分布式算法,如分布式锁、分布式事务等。 4.选择合适的技术和框架:选择合适的技术和框架可以简化开发和维护工作。常用的Java分布式框架有Dubbo、Spring Cloud、Apache Hadoop等。 5.搭建环境和部署:搭建分布式环境,部署应用程序。如果需要使用集群模型,可以使用负载均衡器(如Nginx、HaProxy)和分布式存储(如HDFS)等工具进行部署。 6.测试和优化:进行全面的测试和优化,保证程序的正确性和性能。 下面是一个简单的分布式框架的示例代码: ```java // 定义通信协议 public interface DistributedProtocol { String call(String data); } // 实现分布式算法 public class DistributedAlgorithm { public void lock() { // 分布式锁算法实现 } } // 使用Dubbo框架实现分布式服务 @Service public class DistributedService implements DistributedProtocol { @Override public String call(String data) { // 服务实现 } } // 客户端调用 public class DistributedClient { @Reference private DistributedProtocol protocol; public void call(String data) { protocol.call(data); } } ``` 以上是一个简单的分布式框架的示例代码,实现了分布式服务的定义和实现,以及分布式算法的调用。具体实现需要根据应用场景和需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值