微服务物理框架搭建

docker镜像与容器基本的基本操作 文章目录一、docker基本命令(运维版)1、查看镜像——docker images2、查看所有状态容器——docker ps -a3、docker —— run 指令工作流程4、查看docker版本命令——docker -v5、 查看docker信息——docker info6、docker帮助命令文档——docker --help二、docker 镜像操作1、搜索镜像(公共仓库)——docker search2、下载镜像——docker pull3、查看镜像列表——docker images4、获取镜像 阅读详情

word文档地址:https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3/%E5%BE%AE%E6%9C%8D%E5%8A%A1

图片不清晰可以去看word文档

现在我们要搭建一个简单的微服务物理框架,其架构如下
在这里插入图片描述

前置知识

1.Kong
https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3/Kong%20%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0
2.K8s
https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3/kubenetes
3.Docker
https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3/Docker
4.RabbitMQ
https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3/RabbitMQ
5.Jenkins
https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3/Jenkins
6.Linux
https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/Linux%20%E5%B9%B3%E5%8F%B0/Linux%20%E6%95%99%E7%A8%8B
这些知识在Github项目 -> 平台无关 目前下可以找到

环境

我们的示例不需要用到redis和数据库,所以这2个不在当前示例中
我们需要4台服务器

  • master 服务器
  • node1 服务器
  • node2 服务器
  • RabbitMQ服务器
    其中master、node1、node2 构成k8s集群,RabbitMQ服务器作为独立的服务器
    在这里插入图片描述

服务器系统:Ubuntu Server 20.04
注:以下环境搭建请使用root用户

K8s集群环境搭建

下面我们针对master、node1、node2搭建k8s的集群环境,详细的文档请转到 kubenetes目前

安装docker
安装请查看docker目录教程,安装完成后做如下操作

1.编辑vim /etc/docker/daemon.json,没有就新建,添加exec-opts

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

2.重启docker,systemctl restart docker
注:master、node1、node2都要执行

安装kubeadm、kubelet、kubectl

1.安装前置

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

2.使用阿里库(google库国内访问不了)

  • 添加key
    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
  • 添加镜像源库,在vim /etc/apt/sources.list.d/kubernetes.list中添加如下行
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

3.安装

apt-get update
apt-get install -y kubelet kubeadm kubectl

笔者使用的版本是1.23.5,即如下

apt-get install -y kubelet=1.23.5-00 kubeadm=1.23.5-00 kubectl=1.23.5-00

4.设置kubelet开机自启

systemctl enable kubelet

注:master、node1、node2都要执行

在master部署kubernetes
1.部署

kubeadm init \
--apiserver-advertise-address=192.168.102.130 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.5 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

2.部署成功信息
注意,部署成功后会有如下的信息反馈

...
...
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.102.130:6443 --token qc093z.xr3ltsui1loy87cs \
  --discovery-token-ca-cert-hash sha256:902969f599d324185126f53f0b07c02126063fea73f14e05297b65f102e842a0

其中最后一行是在node节点加入集群的命令

kubeadm join 192.168.102.130:6443 --token qc093z.xr3ltsui1loy87cs \
--discovery-token-ca-cert-hash sha256:902969f599d324185126f53f0b07c02126063fea73f14e05297b65f102e842a0

在master安装pod网络插件
在master上执行如下命令

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看插件是否运行

root@k8s-master:~# kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   kube-flannel-ds-p7pf7                1/1     Running   0          61m

在node1和node2上执行加入集群命令

1.Node节点加入集群
如下,我们在node节点执行kubeadm init执行成功后的反馈命令

# kubeadm join 192.168.102.130:6443 --token qc093z.xr3ltsui1loy87cs \
--discovery-token-ca-cert-hash sha256:902969f599d324185126f53f0b07c02126063fea73f14e05297b65f102e842a0

执行该命令后node节点会加入到集群中

2.查看节点是否加入
在master上运行如下名

root@k8s-master:~# kubectl get nodes
NAME         STATUS   ROLES                  AGE    VERSION
k8s-master   Ready    control-plane,master   138m   v1.23.5
k8s-node1    Ready    <none>                 106s   v1.23.5

可以看到k8s-node1已加入集群

安装Kong

现在我们安装kong与konga,详细文档在Github的kong教程目录下

在k8s集群中安装kong
执行如下命令安装kong-ingress

# kubectl apply -f https://bit.ly/k4k8s

使用如下命令查看其创建的service

root@k8s-master:~# kubectl get services -n kong
NAME                      TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
kong-proxy                LoadBalancer   10.1.85.159   <pending>     80:32268/TCP,443:32148/TCP   10m
kong-validation-webhook   ClusterIP      10.1.93.55    <none>        443/TCP                      10m

可以看到我们的kong已经启动,其对应的master服务器的端口为32268,32148
如果想把端口映射到80端口可以执行如下命令,我这里就不执行了

# nohup kubectl port-forward -n kong --address 0.0.0.0 service/kong-proxy 80:80 > nohup.out 2>&1 &

在master服务器上安装konga
这不是必须的,但图像界面管理起来比较方便

1.更改kong-ingress暴露的端口
kong-ingress没有暴露kong admin api,我们需要在集群内部暴露api
所以我们需要更改其Deployment:

# kubectl edit deployments/ingress-kong -n kong

将

- name: KONG_ADMIN_LISTEN
  value: 127.0.0.1:8444 ssl

修改为

- name: KONG_ADMIN_LISTEN
  value: 0.0.0.0:8001, 0.0.0.0:8444 ssl

然后我们新建一个konga.yaml文件

kind: Service  # 资源类型
apiVersion: v1  # 资源版本
metadata: # 元数据
  name: konga # 资源名称
  namespace: kong # 命名空间
spec: # 描述
  selector: # 标签选择器,用于确定当前service代理哪些pod
    app: ingress-kong
  type: ClusterIP # 类型,值NodePort允许外部访问,值 ClusterIP 只能在集群内访问
  ports: # 端口信息
  - name: proxy-admin
    port: 8001  # service端口
    targetPort: 8001 # pod端口
  - name: proxy-admin-ssl
    port: 8444  # service端口
    targetPort: 8444 # pod端口

执行如下命令应用service

# kubectl apply -f konga.yaml

查看我们konga service的地址

root@k8s-master:~# kubectl get services -A
NAMESPACE       NAME                                 TYPE           CLUSTER-IP     PORT(S)          
kong            konga                                ClusterIP      10.1.184.146   8001/TCP,8444/TCP

可以看到地址为10.1.184.146

2.创建docker网络

# docker network create -d bridge kongnet

3.安装postgres数据库

# sudo mkdir -p /opt/postgres/data
# sudo docker run -d --name postgres \
--network kongnet \
--restart=always \
-e POSTGRES_PASSWORD=kong123 \
-p 5432:5432 \
-v /home/software/postgres/data:/var/lib/postgresql/data \
postgres:9.6

4.进入数据库创建用户和数据库

// 进入容器
# sudo docker exec -it postgres /bin/bash
// 进入数据库
# psql -U postgres
// 创建用户,创建数据库
# CREATE USER kong WITH PASSWORD 'kong123';
# CREATE DATABASE konga OWNER kong;
// 退出数据库,退出容器
# \q
# exit

5.安装konga

# docker run -d --name konga \
--network kongnet \
--restart=always \
-p 1337:1337 \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=postgres" \
-e "DB_PORT=5432" \
-e "DB_USER=kong" \
-e "DB_PASSWORD=kong123" \
-e "DB_DATABASE=konga" \
-e "NODE_ENV=development" \
docker.io/pantsel/konga:0.14.7

6.访问http://192.168.102.130:1337,(192.168.102.130是我k8s master的地址)
登录进去后连接kong,这里的连接地址是我们前面创建的k8s服务的地址10.1.184.146
在这里插入图片描述

安装jenkins

接下来我们在master服务器上安装jenkins

安装
1.安装jdk

# sudo apt-get install openjdk-8-jdk

2.设置密匙

# wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

3.添加镜像源

# sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
/etc/apt/sources.list.d/jenkins.list'

4.安装Jenkins

# sudo apt-get update
# sudo apt-get install jenkins

配置权限
有时我们需要使用sudo,但jenkins由于没有权限无法执行某些命令,所以需要改变以下jenkins的权限
1.添加sudoers编辑权限

# sudo chmod u+w /etc/sudoers

2.编辑sudoers

# sudo vim /etc/sudoers

3.在最后加一行

jenkins ALL=(ALL) NOPASSWD: ALL

4.重启jenkins

# service jenkins restart

测试
我们访问http://masterip:8080就可以看到jenkins了

安装RabbitMQ

接下来我们在RabbitMQ服务器上安装RabbitMQ,我们使用docker进行安装
安装docker
详情情况docker教程目录

安装rabbitmq
执行如下命令安装

# docker run -itd --restart=always --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management

安装完成后,访问http://IP:15672/ 进入rabbitmq,默认用户名/密码为 guest/guest
至此,物理框架已搭建完成,后面有时间在示例微服务的集成和部署

自动部署

如下我们做一个自动部署的示例

登录docker
我们使用docker作为镜像库,需要在master、node1、node2上都执行 docker login 登录命令

创建jenkins任务
1.进入jenkins创建一个Freestyle project风格的项目
在这里插入图片描述

2.任务描述
在这里插入图片描述

3.指定仓库地址和分支
在这里插入图片描述

4.指定触发条件,这里是没60分支执行一次(正常情况我们是2周发布一次)
在这里插入图片描述

5.指定构建环境,根据个人喜好勾选
在这里插入图片描述

6.指定构建动作,这里我使用的是Shell
在这里插入图片描述

其命令如下,步骤大概是

#!/bin/bash

# 如果没有更新则不发布
if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_COMMIT" ]
then
echo "no update";
exit 0;
fi

# 生成镜像名
echo "has update";
imagename="iceemblem/mircservice:$BUILD_NUMBER";
echo $imagename;

# 生成镜像
sudo docker build -t $imagename .
# 发布镜像到 dockerhub
sudo docker image push $imagename
# 执行 k8s 部署命令
echo "
apiVersion: apps/v1
kind: Deployment      
metadata:
  name: mircservice
spec: 
  # 副本数量
  replicas: 2
  selector:
    matchLabels:
      app: mircservice
  template:
    # pods 的标签
    metadata:
      labels:
        app: mircservice
    # 使用的镜像
    spec:
      containers:
      - name: mircservice
        image: $imagename
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: mircservice-svc
spec:
  ports:
  - port: 80
    name: 80port
    protocol: TCP
    targetPort: 80
  selector:
    app: mircservice
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mircservice-ingress
spec:
  ingressClassName: kong
  rules:
  - http:
      paths:
      - path: /api/mircservice
        pathType: ImplementationSpecific
        backend:
          service:
            name: mircservice-svc
            port:
              number: 80
" | sudo kubectl apply -f -

7.最后点击保存
在这里插入图片描述

回到项目页点击立即发布手动发布我们的应用
在这里插入图片描述

查看部署效果
我们访问http://masterip:32268/api/mircservice/test,可以看到请求被重定向到我们的服务了,其中/api/mircservice/test返回的结果为3

在这里插入图片描述

最后

写文章不易,大佬,给个星吧٩(●˙ε˙●)۶:https://github.com/IceEmblem/LearningDocuments

【Tars】腾讯微服务框架Tars介绍 Tars是【基于名字服务】【使用Tars协议】的高性能【RPC】开发框架,同时配套一体化的【服务治理平台】,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars在腾讯内部名为TAF,内部从08年开始使用,到现在将近10个年头了,今年终于开源 阅读详情

相关推荐

微服务(Microservices)- 文章翻译

本文是翻译 https://martinfowler.com/articles/microservices.html 的内容,旨在介绍一下微服务这种设计架构,希望大家尽量阅读原文。文中翻译难免有疏漏,希望大家不吝指正,共同学习。———————————————————————————————————— 微服务架构的定义“微服务架构”(Microservice Architecture)一词在过去的几

zlz18225318697的博客 1145

确保您的 API 安全:Kong Gateway 顶级安全性的最佳实践

随着API成为现代应用程序开发的基础,攻击面不断扩大。那么解决方案是什么?就是API安全。想要深入了解如何确保您组织中的API安全最佳实践吗?本文会找到答案。

hangen的博客 1307

别再为CAD和GIS数据对不上而头疼了!一份完整的ArcGIS for AutoCAD坐标系定义与数据套合指南

本文详细介绍了如何通过ArcGIS for AutoCAD插件解决CAD与GIS数据坐标系不匹配的问题,实现数据的精准套合。文章从坐标系冲突分析、插件核心功能解析到五步标准化工作流,提供了完整的解决方案,帮助工程师和设计师提升跨平台协作效率。

weixin_42531886的博客 217

trocr-base-ru社区贡献指南:如何参与模型改进和数据集建设

trocr-base-ru是一个基于Transformer的俄罗斯语文本识别模型,旨在提供高精度的图像转文字功能。本指南将帮助你了解如何参与模型改进、数据集建设和社区贡献,即使你是AI和OCR领域的新手。 ## 为什么参与trocr-base-ru社区贡献? 参与开源项目贡献不仅能提升你的技术能力,还能为俄罗斯语文本识别技术的发展做出实际贡献。通过贡献,你可以: - 改进模型在特定场景下的识别

gitblog_00004的博客 606

09、Flutter FFI Dart Native API

本文介绍了 Dart Native API 的基本用法,解决了 Dart 与 C 异步通讯的问题

eieihihi的专栏 4400

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南

本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。

gpu4optimizer的博客 866

微服务部署

微服务应用开发完毕后,接下来要做的就是将已开发好的微服务应用部署到环境中。部署包含两个相互关联的概念:流程和架构。部署流程包括一些由开发人员和运维人员执行的步骤,以便将软件投入到生产环境(商用环境,任何修改都会影响到用户)。部署架构则定义了该软件运行的环境结构。随着自动化、虚拟化技术的发展和完善,早先将代码构建产物手动部署生产环境的历史,已经逐渐被基于流水线自动化部署替代,之前由物理机组成的生产环境,也已逐渐被轻量级、短生命周期的计算基础设施取代。 ...

云原生Java Web领域技术博客 6489

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 448

daemon.json添加“exec-opts“: [“native.cgroupdriver=systemd“]后无法启动的问题

目录报错引流前言解决 报错引流 Job for docker.service failed because the control process exited with error docker修改"exec-opts": [“native.cgroupdriver=systemd”]后启动不了 the following directives are specified both as a flag and in the configura… 前言 在安装k8s集群时,需要把docker的cgroup改

清风 7385

AUTOSAR入门

一、AUTOSAR是什么 AUTOSAR组织自己的介绍是 AUTOSAR (AUTomotive Open System ARchitecture) is a worldwide development partnership of vehicle manufacturers, suppliers, service providers and companies from the automot...

天涯遍地是小草的博客 3万+

分子动力学模拟学习1-采用AmberTools21的MCPB.py构建金属蛋白的top文件

分子动力学模拟学习1-采用AmberTools21的MCPB.py构建金属蛋白的top文件

weixin_45011386的博客 3826

微服务(Microservices)—Martin Flower

微服务(Microservices)—Martin Flower 原文:Martin Flower 于 2014 年 3 月 25 日写的《Microservices》。 译文:秦疆のJava世界 微服务 “微服务架构(Microservice Architecture)”一词在过去几年里广泛的传播,它用于描述一种设计应用程序的特别方式,作为一套独立可部署的服务。目前,这种架构方式还没有准确的...

luoru的博客 4965

DIY等离子环:从Class-E电路到七彩辉光,手把手教你打造炫酷科学玩具

本文手把手教你DIY一个炫酷的等离子环科学玩具。从解析等离子体辉光放电原理入手,详细介绍了核心的Class-E自激振荡电路设计、关键元件选型与参数计算,并提供了从物料准备、电路搭建、腔体密封到上电调试的全流程指南。通过调制电路或填充不同气体,还能实现七彩变换与交互效果,是学习高频电路与电磁场知识的绝佳实践项目。

weixin_29305337的博客 635

我们什么时候需要微服务?When Do I Need Microservices?

宗教、法律和公约的创建是为了解决社会问题,正如新技术是为了解决技术问题而创建的一样。微服务架构是对一个技术问题的新技术发展。不幸的是,由于缺乏对微服务历史的了解,这个概念在软件开发社区中仍然存在争议。Religions, laws, and conventions have been created to address societal problems just as new technolo...

AI天才研究院 1万+

ICML-2025《Learning from Sample Stability for Deep Clustering》

用于指导深度聚类模型的训练,从而提升模型对困难样本的学习能力,最终改善整体聚类性能。首先,利用K-means在原始样本(非增强)的表征上进行聚类,得到初始聚类分配。其目的是鼓励模型对同一稳定样本在连续epoch中产生相近的表征。输出差异大)会产生更大的损失值,从而引导模型优先优化这些困难样本。此损失借鉴了NT-Xent损失的思想,但将正样本对定义为。最后,通过对比学习优化聚类中心,将同一聚类在。为了获得更具代表性的聚类中心,论文提出。为了学习更鲁棒的表征,模型在在线网络。首先,论文定义了样本。

Christo的博客 829

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

微服务(Microservices)

微服务(Microservices)——Martin Flower 本文内容 微服务 微服务风格的特性 组件化(Componentization )与服务(Services) 围绕业务功能的组织 产品不是项目 强化终端及弱化通道 分散治理 分散数据管理 基础设施自动化 容错性设计 设计改进 微服务是未来吗 其它 微服务系统多大 微服务与SOA 多语言多选择 实践标准和强制标准 让做对事更容易 断路器circuit breaker和产品中现有的代码 同步是有害的 参考资料 微服务 “微服务架构(Microse

Sunshine_hws的博客 364

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

微服务(Microservices)— Martin Fowler

原文是 Martin Fowler 于 2014 年 3 月 25 日写的《Microservices》。 微服务 “微服务架构(Microservice Architecture)”一词在过去几年里广泛的传播,它用于描述一种设计应用程序的特别方式,作为一套独立可部署的服务。目前,这种架构方式还没有准确的定义,但是在围绕业务能力的组织、自动部署(automated deployment)、端智能(intelligence in the endpoints)、语言和数据的分散控制,却有着某种共同的特征。 “

半山腰太挤了,你要去山顶看看 593

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

微服务架(Microservices)构究竟是什么?

关注「前端向后」微信公众号,你将收获一系列「用心原创」的高质量技术文章,主题包括但不限于前端、Node.js以及服务端技术 本文首发于 ayqy.net ,原文链接:http://www.ayqy.net/blog/微服务架构(microservices)/ 零.从 Monolithic application 说起 Monolith means composed all in one piec...

ayqy_jiajie的博客 1441

微服务(Microservices)——Martin Flower

原文是 Martin Flower 于 2014 年 3 月 25 日写的。

我是一只蘑菇17的博客 451

微服务(Microservices)【翻译】

1微服务 “微服务架构(Microservice Architecture)”一词在过去几年里广泛的传播,它用于描述一种设计应用程序的特别方式,作为一套独立可部署的服务。目前,这种架构方式还没有准确的定义,但是在围绕业务能力的组织、自动部署(automated deployment)、端智能(intelligence in the endpoints)、语言和数据的分散控制发面,却有着某些共同的...

勇往直前的专栏 6903

微服务架构设计实践系列之十一:物理架构

微服务架构设计实践 目    次1 序言2 微服务3 软件架构设计思想4 微服务架构设计实践4.1 项目概述4.2 架构准备阶段4.3 概念架构阶段4.4 细化架构阶段4.4.1 业务架构4.4.2 数据架构4.4.3 应用架构4.4.4 技术架构4.4.5 物理架构4.4.6 开发架构4.4.5  物理架构4.4.5.1  物理架构定义        物理架构定义了“程序”如何映射(安装、部署或...

闲来无事 1万+
上一篇: k8s部署Kong
下一篇: .NET RabbitMQ
dabusidede
博客等级 码龄9年 84粉丝 208原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值