feat: add ISP footer link
continuous-integration/drone/push Build is failing

This commit is contained in:
simple321vip
2026-06-29 23:47:46 +08:00
parent 86d7359727
commit 299cdb84e0
5 changed files with 799 additions and 418 deletions
+43
View File
@@ -0,0 +1,43 @@
# violin-cv K8s 部署
## 一键部署
```bash
kubectl apply -f namespace.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
```
## 验证
```bash
# 看 pod 启动
kubectl get pods -n drone -l app=violin-cv
# 看 service / ingress
kubectl get svc,ing -n drone -l app=violin-cv
# 测访问
curl -I http://cv.violin-work.online/
```
## 文件说明
| 文件 | 作用 |
|------|------|
| `namespace.yaml` | K8s namespace**不会真正创建**,因为 drone namespace 已存在;保留是声明依赖) |
| `deployment.yaml` | 1 个 nginx 容器跑 HTMLreplicas=1,资源极省 |
| `service.yaml` | ClusterIP,端口 80 |
| `ingress.yaml` | `cv.violin-work.online` → service:80TLS 暂时不配,用 cert-manager 后再说) |
## 镜像
`.drone.yml` 自动 push 到 `ccr.ccs.tencentyun.com/violin/violin-cv:latest`
## 域名
`cv.violin-work.online` 需要:
1. 你的 DNS 把这个域名解析到 K8s ingress 公网 IP
2. 集群已装 nginx-ingress-controller
3. (可选)cert-manager 给 `cv.violin-work.online` 申请证书
+31
View File
@@ -0,0 +1,31 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: violin-cv
namespace: violin
labels:
app: violin-cv
spec:
replicas: 1
selector:
matchLabels:
app: violin-cv
template:
metadata:
labels:
app: violin-cv
spec:
containers:
- name: cv
image: ccr.ccs.tencentyun.com/violin/violin-cv:latest
imagePullPolicy: Always
ports:
- name: http
containerPort: 80
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
+26
View File
@@ -0,0 +1,26 @@
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: violin-ingress
namespace: violin
creationTimestamp: "2026-06-29T15:36:21Z"
annotations:
kubesphere.io/creator: akadmin
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
ingressClassName: traefik
tls:
- hosts:
- cv.violin-home.cn
secretName: violin-tls
rules:
- host: cv.violin-home.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: violin-cv
port:
number: 80
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: violin-cv
namespace: violin
spec:
type: ClusterIP
selector:
app: violin-cv
ports:
- name: http
port: 80
targetPort: http
+341 -73
View File
@@ -1,13 +1,22 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Portfolio</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet" />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=JetBrains+Mono:wght@400;600&display=swap"
rel="stylesheet" />
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--bg: #0a0a0f;
@@ -21,7 +30,9 @@
--radius: 14px;
}
html { scroll-behavior: smooth; }
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', system-ui, sans-serif;
@@ -53,28 +64,47 @@
z-index: 0;
animation: orbFloat 20s ease-in-out infinite;
}
.orb-1 {
width: 500px; height: 500px;
width: 500px;
height: 500px;
background: radial-gradient(circle, rgba(108, 99, 255, 0.15), transparent 70%);
top: -150px; right: -100px;
top: -150px;
right: -100px;
animation-delay: 0s;
}
.orb-2 {
width: 400px; height: 400px;
width: 400px;
height: 400px;
background: radial-gradient(circle, rgba(0, 212, 255, 0.1), transparent 70%);
bottom: -100px; left: -80px;
bottom: -100px;
left: -80px;
animation-delay: -10s;
}
@keyframes orbFloat {
0%, 100% { transform: translate(0,0) scale(1); }
33% { transform: translate(30px,-40px) scale(1.05); }
66% { transform: translate(-20px,20px) scale(0.95); }
0%,
100% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(30px, -40px) scale(1.05);
}
66% {
transform: translate(-20px, 20px) scale(0.95);
}
}
/* Navigation */
nav {
position: fixed;
top: 0; left: 0; right: 0;
top: 0;
left: 0;
right: 0;
z-index: 100;
padding: 20px 40px;
display: flex;
@@ -84,6 +114,7 @@
backdrop-filter: blur(20px);
border-bottom: 1px solid var(--border);
}
nav .logo {
font-family: 'JetBrains Mono', monospace;
font-size: 1.1rem;
@@ -91,12 +122,17 @@
color: var(--accent);
letter-spacing: -0.5px;
}
nav .logo span { color: var(--text); }
nav .logo span {
color: var(--text);
}
nav ul {
list-style: none;
display: flex;
gap: 32px;
}
nav ul a {
color: var(--text-muted);
text-decoration: none;
@@ -105,10 +141,16 @@
letter-spacing: 0.5px;
transition: color 0.2s;
}
nav ul a:hover { color: var(--text); }
nav ul a:hover {
color: var(--text);
}
/* Sections */
section { position: relative; z-index: 1; }
section {
position: relative;
z-index: 1;
}
.container {
max-width: 960px;
@@ -122,7 +164,10 @@
display: flex;
align-items: center;
}
#hero .hero-inner { width: 100%; }
#hero .hero-inner {
width: 100%;
}
.tag-line {
display: inline-flex;
@@ -138,16 +183,26 @@
opacity: 0;
animation: fadeUp 0.6s ease forwards;
}
.tag-line .dot {
width: 6px; height: 6px;
width: 6px;
height: 6px;
background: #4ade80;
border-radius: 50%;
box-shadow: 0 0 8px rgba(74, 222, 128, 0.6);
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.4;
}
}
#hero h1 {
@@ -159,12 +214,14 @@
opacity: 0;
animation: fadeUp 0.6s 0.1s ease forwards;
}
#hero h1 .gradient {
background: linear-gradient(135deg, var(--accent), var(--accent2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
#hero .subtitle {
font-size: 1.15rem;
color: var(--text-muted);
@@ -174,6 +231,7 @@
opacity: 0;
animation: fadeUp 0.6s 0.2s ease forwards;
}
.hero-cta {
display: flex;
gap: 14px;
@@ -181,6 +239,7 @@
opacity: 0;
animation: fadeUp 0.6s 0.3s ease forwards;
}
.btn {
display: inline-flex;
align-items: center;
@@ -194,21 +253,25 @@
cursor: pointer;
border: none;
}
.btn-primary {
background: var(--accent);
color: #fff;
box-shadow: 0 0 20px var(--accent-glow);
}
.btn-primary:hover {
background: #7c74ff;
box-shadow: 0 0 30px rgba(108, 99, 255, 0.4);
transform: translateY(-1px);
}
.btn-ghost {
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
}
.btn-ghost:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.15);
@@ -228,23 +291,40 @@
opacity: 0;
animation: fadeUp 0.6s 0.8s ease forwards;
}
.scroll-line {
width: 1px;
height: 40px;
background: linear-gradient(to bottom, var(--accent), transparent);
animation: scrollDown 2s ease-in-out infinite;
}
@keyframes scrollDown {
0% { transform: scaleY(0); transform-origin: top; }
50% { transform: scaleY(1); transform-origin: top; }
51% { transform-origin: bottom; }
100% { transform: scaleY(0); transform-origin: bottom; }
0% {
transform: scaleY(0);
transform-origin: top;
}
50% {
transform: scaleY(1);
transform-origin: top;
}
51% {
transform-origin: bottom;
}
100% {
transform: scaleY(0);
transform-origin: bottom;
}
}
/* Section headers */
.section-header {
margin-bottom: 48px;
}
.section-label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
@@ -253,6 +333,7 @@
text-transform: uppercase;
margin-bottom: 10px;
}
.section-title {
font-size: 2rem;
font-weight: 700;
@@ -260,23 +341,29 @@
}
/* About */
#about { padding: 120px 0; }
#about {
padding: 120px 0;
}
.about-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 48px;
align-items: start;
}
.about-text p {
color: var(--text-muted);
margin-bottom: 16px;
font-size: 0.95rem;
}
.stats {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.stat-card {
background: var(--surface);
border: 1px solid var(--border);
@@ -284,6 +371,7 @@
padding: 20px;
text-align: center;
}
.stat-card .number {
font-size: 2rem;
font-weight: 700;
@@ -293,6 +381,7 @@
background-clip: text;
display: block;
}
.stat-card .label {
font-size: 0.78rem;
color: var(--text-muted);
@@ -300,12 +389,16 @@
}
/* Skills */
#skills { padding: 120px 0; }
#skills {
padding: 120px 0;
}
.skills-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
}
.skill-card {
background: var(--surface);
border: 1px solid var(--border);
@@ -316,6 +409,7 @@
position: relative;
overflow: hidden;
}
.skill-card::before {
content: '';
position: absolute;
@@ -324,13 +418,19 @@
opacity: 0;
transition: opacity 0.3s;
}
.skill-card:hover {
border-color: rgba(108, 99, 255, 0.3);
transform: translateY(-3px);
}
.skill-card:hover::before { opacity: 1; }
.skill-card:hover::before {
opacity: 1;
}
.skill-icon {
width: 40px; height: 40px;
width: 40px;
height: 40px;
background: rgba(108, 99, 255, 0.1);
border-radius: 10px;
display: flex;
@@ -340,18 +440,21 @@
font-size: 1.2rem;
position: relative;
}
.skill-name {
font-weight: 600;
font-size: 0.95rem;
margin-bottom: 6px;
position: relative;
}
.skill-desc {
font-size: 0.8rem;
color: var(--text-muted);
line-height: 1.5;
position: relative;
}
.skill-bar {
margin-top: 12px;
height: 3px;
@@ -360,6 +463,7 @@
overflow: hidden;
position: relative;
}
.skill-bar-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent), var(--accent2));
@@ -369,18 +473,25 @@
}
/* Experience */
#experience { padding: 120px 0; }
#experience {
padding: 120px 0;
}
.timeline {
position: relative;
padding-left: 32px;
}
.timeline::before {
content: '';
position: absolute;
left: 0; top: 8px; bottom: 8px;
left: 0;
top: 8px;
bottom: 8px;
width: 1px;
background: linear-gradient(to bottom, var(--accent), transparent);
}
.timeline-item {
position: relative;
margin-bottom: 40px;
@@ -388,47 +499,56 @@
transform: translateY(20px);
transition: all 0.5s ease;
}
.timeline-item.visible {
opacity: 1;
transform: translateY(0);
}
.timeline-item::before {
content: '';
position: absolute;
left: -36px;
top: 8px;
width: 9px; height: 9px;
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 12px var(--accent-glow);
}
.timeline-date {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
color: var(--text-muted);
margin-bottom: 6px;
}
.timeline-role {
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 4px;
}
.timeline-company {
color: var(--accent);
font-size: 0.88rem;
margin-bottom: 10px;
}
.timeline-desc {
color: var(--text-muted);
font-size: 0.88rem;
line-height: 1.7;
}
.timeline-tags {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-top: 12px;
}
.tag {
padding: 3px 10px;
background: rgba(108, 99, 255, 0.08);
@@ -440,12 +560,16 @@
}
/* Projects */
#projects { padding: 120px 0; }
#projects {
padding: 120px 0;
}
.projects-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
}
.project-card {
background: var(--surface);
border: 1px solid var(--border);
@@ -456,18 +580,22 @@
position: relative;
overflow: hidden;
}
.project-card:hover {
border-color: rgba(108, 99, 255, 0.3);
transform: translateY(-4px);
}
.project-top {
display: flex;
justify-content: space-between;
align-items: start;
margin-bottom: 16px;
}
.project-icon {
width: 42px; height: 42px;
width: 42px;
height: 42px;
background: rgba(108, 99, 255, 0.1);
border-radius: 10px;
display: flex;
@@ -475,9 +603,15 @@
justify-content: center;
font-size: 1.2rem;
}
.project-links { display: flex; gap: 10px; }
.project-links {
display: flex;
gap: 10px;
}
.project-link {
width: 30px; height: 30px;
width: 30px;
height: 30px;
border-radius: 6px;
background: var(--border);
display: flex;
@@ -488,18 +622,25 @@
font-size: 0.8rem;
transition: all 0.2s;
}
.project-link:hover { background: var(--accent); color: #fff; }
.project-link:hover {
background: var(--accent);
color: #fff;
}
.project-name {
font-size: 1.05rem;
font-weight: 600;
margin-bottom: 8px;
}
.project-desc {
font-size: 0.85rem;
color: var(--text-muted);
line-height: 1.6;
margin-bottom: 16px;
}
.project-tech {
display: flex;
gap: 6px;
@@ -507,18 +648,28 @@
}
/* Contact */
#contact { padding: 120px 0 80px; }
#contact {
padding: 120px 0 80px;
}
.contact-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 48px;
}
.contact-info p {
color: var(--text-muted);
font-size: 0.95rem;
margin-bottom: 28px;
}
.contact-links { display: flex; flex-direction: column; gap: 14px; }
.contact-links {
display: flex;
flex-direction: column;
gap: 14px;
}
.contact-link {
display: flex;
align-items: center;
@@ -532,12 +683,15 @@
font-size: 0.88rem;
transition: all 0.2s;
}
.contact-link:hover {
border-color: rgba(108, 99, 255, 0.3);
background: rgba(108, 99, 255, 0.05);
}
.contact-link .cl-icon {
width: 34px; height: 34px;
width: 34px;
height: 34px;
background: rgba(108, 99, 255, 0.1);
border-radius: 8px;
display: flex;
@@ -546,11 +700,13 @@
font-size: 0.9rem;
flex-shrink: 0;
}
.contact-form {
display: flex;
flex-direction: column;
gap: 14px;
}
.form-group input,
.form-group textarea {
width: 100%;
@@ -565,15 +721,21 @@
transition: border-color 0.2s;
resize: none;
}
.form-group input:focus,
.form-group textarea:focus {
border-color: var(--accent);
}
.form-group input::placeholder,
.form-group textarea::placeholder {
color: var(--text-muted);
}
.form-group textarea { min-height: 120px; }
.form-group textarea {
min-height: 120px;
}
.form-group button {
align-self: flex-start;
}
@@ -588,13 +750,42 @@
font-size: 0.78rem;
border-top: 1px solid var(--border);
}
footer a { color: var(--text-muted); text-decoration: none; }
footer a:hover { color: var(--accent); }
footer a {
color: var(--text-muted);
text-decoration: none;
}
footer a:hover {
color: var(--accent);
}
footer .icp {
margin-top: 6px;
font-size: 0.72rem;
opacity: 0.7;
}
footer .icp a {
color: var(--text-muted);
text-decoration: none;
}
footer .icp a:hover {
color: var(--accent);
}
/* Animations */
@keyframes fadeUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.reveal {
@@ -602,6 +793,7 @@
transform: translateY(30px);
transition: all 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
@@ -610,7 +802,8 @@
/* Cursor follower */
.cursor-glow {
position: fixed;
width: 300px; height: 300px;
width: 300px;
height: 300px;
border-radius: 50%;
background: radial-gradient(circle, rgba(108, 99, 255, 0.06), transparent 70%);
pointer-events: none;
@@ -621,21 +814,45 @@
/* Responsive */
@media (max-width: 768px) {
nav { padding: 16px 20px; }
nav ul { gap: 18px; }
.container { padding: 0 20px; }
nav {
padding: 16px 20px;
}
nav ul {
gap: 18px;
}
.container {
padding: 0 20px;
}
.about-grid,
.contact-grid,
.projects-grid { grid-template-columns: 1fr; }
.skills-grid { grid-template-columns: repeat(2, 1fr); }
.stats { grid-template-columns: 1fr 1fr; }
.projects-grid {
grid-template-columns: 1fr;
}
.skills-grid {
grid-template-columns: repeat(2, 1fr);
}
.stats {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 480px) {
.skills-grid { grid-template-columns: 1fr; }
nav ul { display: none; }
.skills-grid {
grid-template-columns: 1fr;
}
nav ul {
display: none;
}
}
</style>
</head>
<body>
<div class="orb orb-1"></div>
@@ -662,15 +879,20 @@
<span class="dot"></span>
Open to work
</div>
<h1>你好,我是<br /><span class="gradient">王明</span></h1>
<h1>你好,我是<br /><span class="gradient">管祥玮</span></h1>
<p class="subtitle">全栈工程师,专注 Kubernetes、云原生架构与分布式系统。热爱把复杂的东西拆干净、再装回去。</p>
<div class="hero-cta">
<a href="#contact" class="btn btn-primary">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" />
<polyline points="22,6 12,13 2,6" />
</svg>
联系我
</a>
<a href="#projects" class="btn btn-ghost">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />
</svg>
看项目
</a>
</div>
@@ -697,7 +919,7 @@
</div>
<div class="stats reveal">
<div class="stat-card">
<span class="number">6+</span>
<span class="number">8+</span>
<span class="label">年经验</span>
</div>
<div class="stat-card">
@@ -729,37 +951,49 @@
<div class="skill-icon"></div>
<div class="skill-name">Kubernetes</div>
<div class="skill-desc">集群管理、Operator 开发、HPA/VPA、自动扩缩容、集群联邦</div>
<div class="skill-bar"><div class="skill-bar-fill" data-width="92"></div></div>
<div class="skill-bar">
<div class="skill-bar-fill" data-width="92"></div>
</div>
</div>
<div class="skill-card reveal">
<div class="skill-icon">🐳</div>
<div class="skill-name">Docker / Containerd</div>
<div class="skill-desc">镜像构建优化、多阶段构建、Harbor 私有仓库、安全扫描</div>
<div class="skill-bar"><div class="skill-bar-fill" data-width="90"></div></div>
<div class="skill-bar">
<div class="skill-bar-fill" data-width="90"></div>
</div>
</div>
<div class="skill-card reveal">
<div class="skill-icon"></div>
<div class="skill-name">Go</div>
<div class="skill-desc">Kubernetes 客户端开发、CLI 工具、微服务编写、性能调优</div>
<div class="skill-bar"><div class="skill-bar-fill" data-width="85"></div></div>
<div class="skill-bar">
<div class="skill-bar-fill" data-width="85"></div>
</div>
</div>
<div class="skill-card reveal">
<div class="skill-icon">🔀</div>
<div class="skill-name">CI/CD</div>
<div class="skill-desc">ArgoCD、GitLab CI、Jenkins、FluxCD GitOps 流水线</div>
<div class="skill-bar"><div class="skill-bar-fill" data-width="88"></div></div>
<div class="skill-bar">
<div class="skill-bar-fill" data-width="88"></div>
</div>
</div>
<div class="skill-card reveal">
<div class="skill-icon">📊</div>
<div class="skill-name">可观测性</div>
<div class="skill-desc">Prometheus + Grafana 监控体系、Jaeger 链路追踪、Loki 日志</div>
<div class="skill-bar"><div class="skill-bar-fill" data-width="85"></div></div>
<div class="skill-bar">
<div class="skill-bar-fill" data-width="85"></div>
</div>
</div>
<div class="skill-card reveal">
<div class="skill-icon">☁️</div>
<div class="skill-name">公有云 / IaC</div>
<div class="skill-desc">AWS / GCP / 阿里云,Terraform / Pulumi 基础设施代码化</div>
<div class="skill-bar"><div class="skill-bar-fill" data-width="80"></div></div>
<div class="skill-bar">
<div class="skill-bar-fill" data-width="80"></div>
</div>
</div>
</div>
</div>
@@ -777,7 +1011,8 @@
<div class="timeline-date">2022 — 至今</div>
<div class="timeline-role">高级 DevOps / 云原生工程师</div>
<div class="timeline-company">某科技公司 · 基础设施部</div>
<div class="timeline-desc">负责公司 K8s 集群(50+节点)运维与优化,推进 GitOps 落地,搭建全链路可观测体系,SLA 达 99.95%。主导容器安全加固项目,漏洞响应时间从 24h 降至 2h。</div>
<div class="timeline-desc">负责公司 K8s 集群(50+节点)运维与优化,推进 GitOps 落地,搭建全链路可观测体系,SLA 达 99.95%。主导容器安全加固项目,漏洞响应时间从 24h
降至 2h。</div>
<div class="timeline-tags">
<span class="tag">Kubernetes</span>
<span class="tag">ArgoCD</span>
@@ -790,7 +1025,8 @@
<div class="timeline-date">2020 — 2022</div>
<div class="timeline-role">后端开发工程师</div>
<div class="timeline-company">某互联网公司 · 平台技术部</div>
<div class="timeline-desc">负责订单系统微服务化改造(单体 → 12 个服务),引入 gRPC + Istio 服务网格,QPS 从 200 提升至 3000+P99 延迟降低 60%。</div>
<div class="timeline-desc">负责订单系统微服务化改造(单体 → 12 个服务),引入 gRPC + Istio 服务网格,QPS 从 200 提升至 3000+P99 延迟降低 60%。
</div>
<div class="timeline-tags">
<span class="tag">Go</span>
<span class="tag">gRPC</span>
@@ -828,10 +1064,17 @@
<div class="project-icon"></div>
<div class="project-links">
<a href="#" class="project-link" title="GitHub">
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
<a href="#" class="project-link" title="外部链接">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
<polyline points="15 3 21 3 21 9" />
<line x1="10" y1="14" x2="21" y2="3" />
</svg>
</a>
</div>
</div>
@@ -848,7 +1091,10 @@
<div class="project-icon">🔀</div>
<div class="project-links">
<a href="#" class="project-link" title="GitHub">
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
</div>
</div>
@@ -866,7 +1112,10 @@
<div class="project-icon">📊</div>
<div class="project-links">
<a href="#" class="project-link" title="GitHub">
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
</div>
</div>
@@ -884,7 +1133,10 @@
<div class="project-icon"></div>
<div class="project-links">
<a href="#" class="project-link" title="GitHub">
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
</div>
</div>
@@ -913,19 +1165,28 @@
<div class="contact-links">
<a href="mailto:hello@example.com" class="contact-link">
<div class="cl-icon">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" />
<polyline points="22,6 12,13 2,6" />
</svg>
</div>
hello@example.com
</a>
<a href="#" class="contact-link">
<div class="cl-icon">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z" />
</svg>
</div>
github.com/wangming
</a>
<a href="#" class="contact-link">
<div class="cl-icon">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</div>
linkedin.com/in/wangming
</a>
@@ -942,7 +1203,10 @@
<textarea placeholder="想说点什么..."></textarea>
</div>
<button type="submit" class="btn btn-primary">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<line x1="22" y1="2" x2="11" y2="13" />
<polygon points="22 2 15 22 11 13 2 9 22 2" />
</svg>
发送消息
</button>
</form>
@@ -952,7 +1216,10 @@
<!-- Footer -->
<footer>
<p>Designed &amp; Built by <a href="#">Wang Ming</a> · 2024</p>
<p>Designed &amp; Built by <a href="#">Wang Ming</a> · Violin Home ©Copyright 2022-2026</p>
<p class="icp">
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank" rel="noopener">辽ICP备2022003637号-2</a>
</p>
</footer>
<script>
@@ -999,4 +1266,5 @@
</script>
</body>
</html>