# 腾讯无界微服务实战:前端微服务框架的实际应用
## 1. 实战准备
### 1.1 环境搭建
**安装无界微服务CLI**:
“`bash
npm install -g tencent-unbounded-cli
“`
**验证安装**:
“`bash
unbounded –version
# 输出:unbounded-cli version 1.0.0
“`
### 1.2 项目初始化
**创建项目**:
“`bash
# 创建项目目录
mkdir unbounded-demo
cd unbounded-demo
# 初始化无界微服务项目
unbounded init .
“`
**项目结构**:
“`
unbounded-demo/
├── unbounded.config.js # 无界微服务配置文件
├── package.json
├── services/ # 微服务目录
│ ├── frontend-service/ # 前端微服务
│ └── api-service/ # API微服务
└── gateway/ # 服务网关
“`
## 2. 实战Demo:构建电商前端微服务
### 2.1 创建前端微服务
**创建商品服务**:
“`bash
unbounded create service product-service –template react
“`
**商品服务配置**:
“`javascript
// services/product-service/unbounded.config.js
module.exports = {
service: {
name: ‘product-service’,
port: 3001,
dependencies: []
},
gateway: {
routes: [
{
path: ‘/products’,
service: ‘product-service’
}
]
}
};
“`
**商品服务组件**:
“`javascript
// services/product-service/src/components/ProductList.js
import React, { useState, useEffect } from ‘react’;
const ProductList = () => {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
// 模拟获取商品数据
setTimeout(() => {
setProducts([
{ id: 1, name: ‘商品1’, price: 100, stock: 10 },
{ id: 2, name: ‘商品2’, price: 200, stock: 5 },
{ id: 3, name: ‘商品3’, price: 300, stock: 8 }
]);
setLoading(false);
}, 1000);
}, []);
if (loading) {
return
;
}
return (
商品列表
-
{products.map(product => (
-
{product.name}
价格: ¥{product.price}
库存: {product.stock}
))}
);
};
export default ProductList;
“`
### 2.2 创建订单服务
**创建订单服务**:
“`bash
unbounded create service order-service –template vue
“`
**订单服务配置**:
“`javascript
// services/order-service/unbounded.config.js
module.exports = {
service: {
name: ‘order-service’,
port: 3002,
dependencies: []
},
gateway: {
routes: [
{
path: ‘/orders’,
service: ‘order-service’
}
]
}
};
“`
**订单服务组件**:
“`vue
创建订单
订单创建成功!订单ID: {{ orderId }}
“`
### 2.3 创建用户服务
**创建用户服务**:
“`bash
unbounded create service user-service –template angular
“`
**用户服务配置**:
“`javascript
// services/user-service/unbounded.config.js
module.exports = {
service: {
name: ‘user-service’,
port: 3003,
dependencies: []
},
gateway: {
routes: [
{
path: ‘/users’,
service: ‘user-service’
}
]
}
};
“`
**用户服务组件**:
“`typescript
// services/user-service/src/app/user-profile/user-profile.component.ts
import { Component, OnInit } from ‘@angular/core’;
@Component({
selector: ‘app-user-profile’,
templateUrl: ‘./user-profile.component.html’,
styleUrls: [‘./user-profile.component.css’]
})
export class UserProfileComponent implements OnInit {
user = {
id: 1,
name: ‘张三’,
email: ‘zhangsan@example.com’,
phone: ‘13800138000’
};
constructor() { }
ngOnInit(): void {
}
}
“`
“`html
“`
## 3. 服务间通信实战
### 3.1 HTTP通信
**订单服务调用商品服务**:
“`javascript
// services/order-service/src/utils/api.js
async function getProduct(productId) {
try {
const response = await fetch(‘http://localhost:8080/products/’ + productId);
if (!response.ok) {
throw new Error(‘Failed to fetch product’);
}
return await response.json();
} catch (error) {
console.error(‘Error fetching product:’, error);
return null;
}
}
// 在订单创建时调用
async function createOrder(orderData) {
const product = await getProduct(orderData.productId);
if (!product) {
throw new Error(‘Product not found’);
}
if (product.stock < orderData.quantity) {
throw new Error('Insufficient stock');
}
// 创建订单逻辑
return {
id: Math.floor(Math.random() * 10000),
...orderData,
productName: product.name,
totalPrice: product.price * orderData.quantity
};
}
```
### 3.2 事件总线通信
**使用无界微服务事件总线**:
```javascript
// services/product-service/src/utils/event.js
import { eventBus } from '@tencent/unbounded';
// 发布商品库存更新事件
export function publishStockUpdate(productId, newStock) {
eventBus.publish('stock.updated', {
productId,
newStock,
timestamp: new Date().toISOString()
});
}
// 订阅商品库存更新事件
export function subscribeToStockUpdates(callback) {
return eventBus.subscribe('stock.updated', callback);
}
```
**在订单服务中订阅库存更新**:
```javascript
// services/order-service/src/main.js
import { subscribeToStockUpdates } from './utils/event';
// 订阅库存更新事件
subscribeToStockUpdates((event) => {
console.log(‘Stock updated:’, event.data);
// 更新本地缓存的库存信息
updateStockCache(event.data.productId, event.data.newStock);
});
“`
## 4. 部署与管理
### 4.1 构建微服务
**构建所有微服务**:
“`bash
unbounded build
“`
**构建单个微服务**:
“`bash
unbounded build service product-service
“`
### 4.2 本地部署
**启动开发环境**:
“`bash
unbounded dev
“`
**访问服务**:
– 服务网关:http://localhost:8080
– 商品服务:http://localhost:8080/products
– 订单服务:http://localhost:8080/orders
– 用户服务:http://localhost:8080/users
### 4.3 生产部署
**配置生产环境**:
“`javascript
// unbounded.config.js
module.exports = {
environment: ‘production’,
gateway: {
port: 80,
ssl: {
enabled: true,
cert: ‘/path/to/cert.pem’,
key: ‘/path/to/key.pem’
}
},
services: {
‘product-service’: {
replicas: 3
},
‘order-service’: {
replicas: 2
},
‘user-service’: {
replicas: 2
}
}
};
“`
**部署到生产环境**:
“`bash
unbounded deploy –env production
“`
## 5. 监控与运维
### 5.1 监控面板
**启动监控面板**:
“`bash
unbounded monitor
“`
**监控指标**:
– 服务健康状态
– 请求响应时间
– 错误率
– 资源使用率
### 5.2 日志管理
**查看服务日志**:
“`bash
unbounded logs product-service
“`
**实时日志**:
“`bash
unbounded logs product-service –follow
“`
### 5.3 故障排查
**检查服务状态**:
“`bash
unbounded status
“`
**查看服务详情**:
“`bash
unbounded inspect product-service
“`
## 6. 性能优化
### 6.1 前端优化
**代码分割**:
“`javascript
// services/product-service/src/App.js
import React, { Suspense } from ‘react’;
// 懒加载组件
const ProductDetail = React.lazy(() => import(‘./components/ProductDetail’));
function App() {
return (
商品服务
}>