Rust微服务架构实战——gRPC通信、服务发现与容器编排

Rust微服务架构实战——gRPC通信、服务发现与容器编排

第12篇:Rust微服务架构实战——gRPC通信、服务发现与容器编排

在这里插入图片描述

一、学习目标与重点

1.1 学习目标

  1. 理解微服务架构:深入学习微服务的核心概念、优缺点、架构模式,掌握微服务与单体架构的区别
  2. 掌握gRPC通信:熟练使用Tonic(Rust的gRPC实现)定义.proto文件、生成服务端和客户端代码,实现同步/异步通信
  3. 实现服务发现与负载均衡:使用Consul或etcd实现服务注册与发现,使用Ribbon或Nginx实现负载均衡
  4. 容器编排与部署:学习Docker Swarm或Kubernetes的核心概念,使用Docker Compose或Kubernetes YAML文件部署微服务
  5. 实战微服务开发:结合真实场景编写用户管理、订单管理、支付管理三个微服务,实现gRPC通信、服务发现、负载均衡
  6. 监控与运维:使用Prometheus+Grafana监控微服务,使用ELK Stack收集和分析日志

1.2 学习重点

💡 三大核心难点

  1. gRPC的流式通信:理解客户端流式、服务端流式、双向流式通信的应用场景,熟练实现流式通信
  2. 服务发现的原理:深入了解Consul的健康检查机制、服务注册表的实现,解决服务下线和故障转移的问题
  3. 容器编排的网络:理解Kubernetes的Pod网络、Service网络、Ingress网络,解决跨Pod通信的问题

⚠️ 三大高频错误点

  1. gRPC版本兼容性:未正确管理.proto文件的版本,导致服务端和客户端通信失败
  2. 服务发现的延迟:未正确配置健康检查的频率和超时时间,导致服务发现的延迟
  3. 容器编排的资源限制:未正确设置Pod的CPU和内存限制,导致资源浪费或容器崩溃

二、微服务架构基础

2.1 微服务的核心概念

微服务架构是将一个单体应用拆分为多个独立的、可独立部署的服务,每个服务负责一个特定的业务领域。微服务架构的核心特点是:

  1. 服务独立部署:每个服务可以独立开发、测试、部署
  2. 服务通信:服务之间通过网络通信(HTTP/REST、gRPC、消息队列)
  3. 服务注册与发现:服务需要注册自己的位置信息,其他服务需要发现服务的位置信息
  4. 负载均衡:当一个服务有多个实例时,需要将请求分发到不同的实例上
  5. 容错机制:当一个服务实例失败时,需要自动将请求分发到其他实例上
  6. 监控与运维:需要监控服务的运行状态,收集和分析日志

2.2 微服务的优缺点

2.2.1 优点
  1. 技术多样性:每个服务可以使用不同的技术栈
  2. 团队独立性:每个服务可以由一个独立的团队负责
  3. 可扩展性:可以根据业务需求扩展特定的服务
  4. 容错性:当一个服务实例失败时,其他实例可以继续提供服务
  5. 快速部署:每个服务可以独立部署,缩短发布周期
2.2.2 缺点
  1. 复杂度增加:需要管理多个服务、网络通信、服务发现等
  2. 部署成本增加:需要部署和管理多个服务实例
  3. 调试困难:跨服务的调用链调试困难
  4. 数据一致性:需要解决分布式数据一致性的问题

三、gRPC通信实战

gRPC是Google开发的高性能、开源的通用RPC框架,使用Protocol Buffers(PB)作为数据序列化协议,支持多种语言和平台。gRPC的主要特点是:

  1. 高性能:使用HTTP/2作为传输协议,支持二进制数据传输、多路复用、头部压缩
  2. 类型安全:使用Protocol Buffers定义服务和数据结构,生成类型安全的代码
  3. 多语言支持:支持多种语言(Rust、Go、Java、Python等)
  4. 流式通信:支持客户端流式、服务端流式、双向流式通信

3.1 安装依赖

在Cargo.toml中添加Tonic(Rust的gRPC实现)和Protocol Buffers的依赖:

[dependencies] tonic = "0.10" prost = "0.12" prost-types = "0.12" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" tokio = { version = "1", features = ["full"] } [build-dependencies] tonic-build = "0.10" 

3.2 定义.proto文件

在proto目录下创建user.proto文件,定义用户管理服务的接口和数据结构:

syntax = "proto3"; package user.v1; option go_package = "user/v1;user"; // 用户管理服务 service UserService { // 创建用户 rpc CreateUser (CreateUserRequest) returns (CreateUserResponse); // 获取用户 rpc GetUser (GetUserRequest) returns (GetUserResponse); // 获取用户列表(服务端流式通信) rpc ListUsers (ListUsersRequest) returns (stream ListUsersResponse); // 更新用户(客户端流式通信) rpc UpdateUser (stream UpdateUserRequest) returns (UpdateUserResponse); // 删除用户(双向流式通信) rpc DeleteUser (stream DeleteUserRequest) returns (stream DeleteUserResponse); } // 创建用户的请求 message CreateUserRequest { string username = 1; string email = 2; string password = 3; } // 创建用户的响应 message CreateUserResponse { int32 id = 1; string username = 2; string email = 3; string created_at = 4; string updated_at = 5; } // 获取用户的请求 message GetUserRequest { int32 id = 1; } // 获取用户的响应 message GetUserResponse { int32 id = 1; string username = 2; string email = 3; string created_at = 4; string updated_at = 5; } // 获取用户列表的请求 message ListUsersRequest { int32 page = 1; int32 per_page = 2; } // 获取用户列表的响应 message ListUsersResponse { int32 id = 1; string username = 2; string email = 3; string created_at = 4; string updated_at = 5; } // 更新用户的请求 message UpdateUserRequest { int32 id = 1; optional string username = 2; optional string email = 3; optional string password = 4; } // 更新用户的响应 message UpdateUserResponse { int32 id = 1; string username = 2; string email = 3; string created_at = 4; string updated_at = 5; } // 删除用户的请求 message DeleteUserRequest { int32 id = 1; } // 删除用户的响应 message DeleteUserResponse { bool success = 1; string message = 2; } 

3.3 生成服务端和客户端代码

在build.rs文件中配置tonic-build,生成服务端和客户端代码:

fnmain()->Result<(),Box<dynstd::error::Error>>{tonic_build::configure().build_server(true).build_client(true).compile(&["proto/user.proto"],&["proto/"],)?;Ok(())}

3.4 实现服务端

在src/server.rs文件中实现UserService的服务端:

usetonic::{Request,Response,Status};useuser::v1::user_service_server::{UserService,UserServiceServer};useuser::v1::{CreateUserRequest,CreateUserResponse,GetUserRequest,GetUserResponse,ListUsersRequest,ListUsersResponse,UpdateUserRequest,UpdateUserResponse,DeleteUserRequest,DeleteUserResponse,};// 定义用户管理服务的实现#[derive(Debug, Default)]pubstructUserServiceImpl;#[tonic::async_trait]implUserServiceforUserServiceImpl{// 创建用户asyncfncreate_user(&self, request:Request<CreateUserRequest>,)->Result<Response<CreateUserResponse>,Status>{let req = request.into_inner();println!("收到创建用户请求: {:?}", req);// 模拟创建用户的逻辑let resp =CreateUserResponse{ id:1, username: req.username, email: req.email, created_at:chrono::Utc::now().to_rfc3339(), updated_at:chrono::Utc::now().to_rfc3339(),};Ok(Response::new(resp))}// 获取用户asyncfnget_user(&self, request:Request<GetUserRequest>,)->Result<Response<GetUserResponse>,Status>{let req = request.into_inner();println!("收到获取用户请求: {:?}", req);// 模拟获取用户的逻辑let resp =GetUserResponse{ id: req.id, username:format!("user{}", req.id), email:format!("user{}@example.com", req.id), created_at:chrono::Utc::now().to_rfc3339(), updated_at:chrono::Utc::now().to_rfc3339(),};Ok(Response::new(resp))}// 获取用户列表(服务端流式通信)asyncfnlist_users(&self, request:Request<ListUsersRequest>,)->Result<Response<tonic::Streaming<ListUsersResponse>>,Status>{let req = request.into_inner();println!("收到获取用户列表请求: {:?}", req);// 模拟获取用户列表的逻辑letmut users =Vec::new();for i in0..req.per_page {let user =ListUsersResponse{ id:(req.page -1)* req.per_page + i +1, username:format!("user{}",(req.page -1)* req.per_page + i +1), email:format!("user{}@example.com",(req.page -1)* req.per_page + i +1), created_at:chrono::Utc::now().to_rfc3339(), updated_at:chrono::Utc::now().to_rfc3339(),}; users.push(user);}let stream =tonic::async_stream::stream!{for user in users {tokio::time::sleep(std::time::Duration::from_millis(500)).await;yield user;}};Ok(Response::new(stream))}// 更新用户(客户端流式通信)typeUpdateUserStream=tonic::Streaming<UpdateUserRequest>;asyncfnupdate_user(&self, request:Request<Self::UpdateUserStream>,)->Result<Response<UpdateUserResponse>,Status>{letmut stream = request.into_inner();println!("收到更新用户请求: 流式");// 模拟更新用户的逻辑letmut user =UpdateUserResponse{ id:0, username:"".to_string(), email:"".to_string(), created_at:"".to_string(), updated_at:"".to_string(),};whileletSome(req)= stream.message().await?{println!("收到更新用户请求: {:?}", req);if user.id ==0{ user.id = req.id; user.username =format!("user{}", req.id); user.email =format!("user{}@example.com", req.id); user.created_at =chrono::Utc::now().to_rfc3339(); user.updated_at =chrono::Utc::now().to_rfc3339();}ifletSome(username)= req.username { user.username = username;}ifletSome(email)= req.email { user.email = email;}ifletSome(password)= req.password {println!("更新密码: {:?}", password);} user.updated_at =chrono::Utc::now().to_rfc3339();tokio::time::sleep(std::time::Duration::from_millis(500)).await;}Ok(Response::new(user))}// 删除用户(双向流式通信)typeDeleteUserStream=tonic::Streaming<DeleteUserRequest>;asyncfndelete_user(&self, request:Request<Self::DeleteUserStream>,)->Result<Response<tonic::Streaming<DeleteUserResponse>>,Status>{letmut stream = request.into_inner();println!("收到删除用户请求: 流式");let response_stream =tonic::async_stream::try_stream!{whileletSome(req)= stream.message().await?{println!("收到删除用户请求: {:?}", req);tokio::time::sleep(std::time::Duration::from_millis(500)).await;yieldDeleteUserResponse{ success:true, message:format!("用户{}删除成功", req.id),};}};Ok(Response::new(response_stream))}}// 启动服务端pubasyncfnrun_server(addr:&str)->Result<(),Box<dynstd::error::Error>>{let service =UserServiceServer::new(UserServiceImpl::default());tonic::transport::Server::builder().add_service(service).serve(addr.parse()?).await?;Ok(())}

3.5 实现客户端

在src/client.rs文件中实现UserService的客户端:

usetonic::transport::Endpoint;useuser::v1::user_service_client::UserServiceClient;useuser::v1::{CreateUserRequest,CreateUserResponse,GetUserRequest,GetUserResponse,ListUsersRequest,ListUsersResponse,UpdateUserRequest,UpdateUserResponse,DeleteUserRequest,DeleteUserResponse,};// 创建用户管理服务的客户端pubasyncfncreate_user_client(addr:&str)->Result<UserServiceClient<tonic::transport::Channel>,Box<dynstd::error::Error>>{let endpoint =Endpoint::from_static(addr).connect_timeout(std::time::Duration::from_secs(5)).connect().await?;Ok(UserServiceClient::new(endpoint))}// 测试创建用户pubasyncfntest_create_user(client:&mutUserServiceClient<tonic::transport::Channel>)->Result<CreateUserResponse,Box<dynstd::error::Error>>{let req =CreateUserRequest{ username:"testuser".to_string(), email:"[email protected]".to_string(), password:"testpassword".to_string(),};let resp = client.create_user(req).await?.into_inner();println!("创建用户响应: {:?}", resp);Ok(resp)}// 测试获取用户pubasyncfntest_get_user(client:&mutUserServiceClient<tonic::transport::Channel>, id:i32)->Result<GetUserResponse,Box<dynstd::error::Error>>{let req =GetUserRequest{ id };let resp = client.get_user(req).await?.into_inner();println!("获取用户响应: {:?}", resp);Ok(resp)}// 测试获取用户列表(服务端流式通信)pubasyncfntest_list_users(client:&mutUserServiceClient<tonic::transport::Channel>, page:i32, per_page:i32)->Result<Vec<ListUsersResponse>,Box<dynstd::error::Error>>{let req =ListUsersRequest{ page, per_page };letmut stream = client.list_users(req).await?.into_inner();letmut users =Vec::new();whileletSome(user)= stream.message().await?{println!("获取用户列表响应: {:?}", user); users.push(user);}Ok(users)}// 测试更新用户(客户端流式通信)pubasyncfntest_update_user(client:&mutUserServiceClient<tonic::transport::Channel>, id:i32)->Result<UpdateUserResponse,Box<dynstd::error::Error>>{let stream =tonic::async_stream::stream!{yieldUpdateUserRequest{ id, username:Some("updateduser".to_string()), email:None, password:None,};tokio::time::sleep(std::time::Duration::from_millis(500)).await;yieldUpdateUserRequest{ id, username:None, email:Some("[email protected]".to_string()), password:Some("updatedpassword".to_string()),};};let resp = client.update_user(stream).await?.into_inner();println!("更新用户响应: {:?}", resp);Ok(resp)}// 测试删除用户(双向流式通信)pubasyncfntest_delete_user(client:&mutUserServiceClient<tonic::transport::Channel>, ids:&[i32])->Result<Vec<DeleteUserResponse>,Box<dynstd::error::Error>>{let stream =tonic::async_stream::stream!{for&id in ids {yieldDeleteUserRequest{ id };tokio::time::sleep(std::time::Duration::from_millis(500)).await;}};letmut response_stream = client.delete_user(stream).await?.into_inner();letmut responses =Vec::new();whileletSome(resp)= response_stream.message().await?{println!("删除用户响应: {:?}", resp); responses.push(resp);}Ok(responses)}

四、服务发现与负载均衡

4.1 服务发现的原理

服务发现是微服务架构中的一个重要组件,它负责:

  1. 服务注册:服务启动时,将自己的位置信息(IP地址、端口号、服务名)注册到服务注册表中
  2. 服务发现:其他服务需要调用该服务时,从服务注册表中查询该服务的位置信息
  3. 健康检查:定期检查服务实例的健康状态,如果服务实例不健康,则将其从服务注册表中删除
  4. 故障转移:当一个服务实例失败时,自动将请求分发到其他健康的实例上

4.2 使用Consul实现服务发现

Consul是HashiCorp开发的开源服务网格工具,它提供了服务注册与发现、健康检查、配置管理、ACL等功能。

4.2.1 安装Consul

在Docker容器中运行Consul:

docker run -d -p 8500:8500 -p 8600:8600/udp --name consul consul:1.15.3 agent -dev -client 0.0.0.0 
4.2.2 服务注册与发现

使用consul-rs库(Rust的Consul客户端)实现服务注册与发现:

useconsul_rs::ClientasConsulClient;useconsul_rs::api::catalog::Catalog;useconsul_rs::api::health::Health;useserde_json::json;// 创建Consul客户端pubasyncfncreate_consul_client(addr:&str)->Result<ConsulClient,Box<dynstd::error::Error>>{let client =ConsulClient::new(addr)?;Ok(client)}// 注册服务pubasyncfnregister_service(client:&ConsulClient, service_name:&str, service_id:&str, addr:&str, port:u16, tags:&[&str])->Result<(),Box<dynstd::error::Error>>{let catalog =Catalog::new(client);let service =json!({"Name": service_name,"ID": service_id,"Address": addr,"Port": port,"Tags": tags,"Check":{"HTTP":format!("http://{}:{}/health", addr, port),"Interval":"10s","Timeout":"5s"}}); catalog.register(service).await?;println!("服务{}注册成功", service_name);Ok(())}// 发现服务pubasyncfndiscover_service(client:&ConsulClient, service_name:&str)->Result<Vec<(String,u16)>,Box<dynstd::error::Error>>{let health =Health::new(client);let services = health.service(service_name,None,None,None,None).await?;letmut addresses =Vec::new();for service in services {ifletSome(service)= service.Service{iflet(Some(addr),Some(port))=(service.Address, service.Port){ addresses.push((addr, port));}}}println!("发现服务{}的实例: {:?}", service_name, addresses);Ok(addresses)}

4.3 使用Nginx实现负载均衡

Nginx是高性能的HTTP和反向代理服务器,它可以实现基于轮询、IP哈希、最小连接数的负载均衡。

4.3.1 配置Nginx

在nginx.conf文件中配置负载均衡:

http { upstream user_service { server 127.0.0.1:50051; server 127.0.0.1:50052; server 127.0.0.1:50053; } server { listen 8080; server_name localhost; location / { grpc_pass grpc://user_service; } } } 
4.3.2 启动Nginx

在Docker容器中运行Nginx:

docker run -d -p 8080:8080 --name nginx -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf nginx:alpine 

五、容器编排与部署

5.1 容器编排的原理

容器编排是管理多个Docker容器的部署、扩展、健康检查、负载均衡的过程。常见的容器编排工具是Kubernetes。

5.2 使用Kubernetes部署微服务

5.2.1 编写Deployment YAML文件

在k8s/user-service目录下创建deployment.yaml文件:

apiVersion: apps/v1 kind: Deployment metadata:name: user-service-deployment labels:app: user-service spec:replicas:3selector:matchLabels:app: user-service template:metadata:labels:app: user-service spec:containers:-name: user-service image: user-service:latest ports:-containerPort:50051resources:requests:cpu:"0.1"memory:"128Mi"limits:cpu:"0.5"memory:"256Mi"livenessProbe:httpGet:path: /health port:50051initialDelaySeconds:30periodSeconds:10readinessProbe:httpGet:path: /health port:50051initialDelaySeconds:5periodSeconds:5
5.2.2 编写Service YAML文件

在k8s/user-service目录下创建service.yaml文件:

apiVersion: v1 kind: Service metadata:name: user-service-service labels:app: user-service spec:type: ClusterIP selector:app: user-service ports:-name: grpc port:50051targetPort:50051
5.2.3 部署到Kubernetes

使用kubectl命令部署微服务:

kubectl apply -f k8s/user-service/deployment.yaml kubectl apply -f k8s/user-service/service.yaml 

六、真实案例应用

6.1 项目架构

我们将编写三个微服务:

  1. 用户管理服务:负责用户的创建、获取、更新、删除
  2. 订单管理服务:负责订单的创建、获取、更新、删除
  3. 支付管理服务:负责支付的创建、获取、更新、删除

6.2 通信方式

三个微服务之间使用gRPC通信,服务发现使用Consul,负载均衡使用Nginx。

6.3 核心代码实现

⌨️ 用户管理服务的main.rs

useuser_service::server;useuser_service::consul;usestd::env;#[tokio::main]asyncfnmain()->Result<(),Box<dynstd::error::Error>>{let addr =env::var("SERVICE_ADDR").unwrap_or("0.0.0.0:50051".to_string());let consul_addr =env::var("CONSUL_ADDR").unwrap_or("http://127.0.0.1:8500".to_string());let service_name =env::var("SERVICE_NAME").unwrap_or("user-service".to_string());let service_id =env::var("SERVICE_ID").unwrap_or(format!("user-service-{}", addr));// 连接到Consullet consul_client =consul::create_consul_client(&consul_addr).await?;// 注册服务consul::register_service(&consul_client,&service_name,&service_id,"0.0.0.0",50051,&["grpc","rust"],).await?;// 启动服务端println!("用户管理服务启动成功,监听地址: {}", addr);server::run_server(&addr).await?;Ok(())}

⌨️ 订单管理服务的main.rs

useorder_service::server;useorder_service::consul;useorder_service::user_client;usestd::env;#[tokio::main]asyncfnmain()->Result<(),Box<dynstd::error::Error>>{let addr =env::var("SERVICE_ADDR").unwrap_or("0.0.0.0:50052".to_string());let consul_addr =env::var("CONSUL_ADDR").unwrap_or("http://127.0.0.1:8500".to_string());let service_name =env::var("SERVICE_NAME").unwrap_or("order-service".to_string());let service_id =env::var("SERVICE_ID").unwrap_or(format!("order-service-{}", addr));// 连接到Consullet consul_client =consul::create_consul_client(&consul_addr).await?;// 注册服务consul::register_service(&consul_client,&service_name,&service_id,"0.0.0.0",50052,&["grpc","rust"],).await?;// 启动服务端println!("订单管理服务启动成功,监听地址: {}", addr);server::run_server(&addr).await?;Ok(())}

七、常见问题与解决方案

7.1 gRPC版本兼容性

问题现象:服务端和客户端通信失败,报错“unknown field”或“invalid wire type”。

解决方案

  1. 确保服务端和客户端使用相同版本的.proto文件
  2. 每次修改.proto文件后,重新生成服务端和客户端代码
  3. 使用语义化版本控制管理.proto文件的版本

7.2 服务发现的延迟

问题现象:服务启动后,其他服务需要等待一段时间才能发现该服务。

解决方案

  1. 调整健康检查的频率和超时时间
  2. 使用Consul的健康检查机制,确保服务实例健康后再注册到服务注册表中
  3. 使用DNS或API网关进行服务发现,减少服务发现的延迟

7.3 容器编排的资源限制

问题现象:Pod的CPU或内存使用率过高,导致容器崩溃。

解决方案

  1. 正确设置Pod的CPU和内存限制
  2. 监控Pod的资源使用情况
  3. 使用水平或垂直扩展来调整Pod的资源配置

八、总结与展望

8.1 总结

理解了微服务架构:深入学习了微服务的核心概念、优缺点、架构模式,掌握了微服务与单体架构的区别
掌握了gRPC通信:熟练使用Tonic定义.proto文件、生成服务端和客户端代码,实现了同步/异步通信
实现了服务发现与负载均衡:使用Consul实现了服务注册与发现,使用Nginx实现了负载均衡
学习了容器编排与部署:学习了Kubernetes的核心概念,使用Docker Compose和Kubernetes YAML文件部署了微服务
实战了微服务开发:结合真实场景编写了用户管理、订单管理、支付管理三个微服务,实现了gRPC通信、服务发现、负载均衡

8.2 展望

下一篇文章,我们将深入学习Rust的WebAssembly开发,包括Rust到WebAssembly的编译、与JavaScript的交互、WebAssembly模块的部署,通过这些知识我们将能够将Rust代码运行在浏览器中。

Read more

星标超 28 万,OpenClaw 两天两次大更!适配GPT 5.4,告别“抽卡式 Prompt”

星标超 28 万,OpenClaw 两天两次大更!适配GPT 5.4,告别“抽卡式 Prompt”

整理 | 梦依丹 出品 | ZEEKLOG(ID:ZEEKLOGnews) “We don’t do small releases.” 这是 OpenClaw 在发布 2026.3.7 版本时写下的一句话。 刚刚过去的周六与周日,这个 GitHub 星标已超 28 万 的 AI Agent 开源项目再次迎来两轮重量级更新。 两天两次更新:OpenClaw 做了一次“真正的大版本升级” 打开 OpenClaw 的 GitHub 更新日志,你会发现这次版本更新的规模确实不小。在 3 月 7 日发布更新后,第二天又迅速推出 2026.3.8-beta.1 和

By Ne0inhk
苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * 多所高校要求警惕 OpenClaw 安全风险,部分严禁校内使用 * 荣耀 CEO 李健:荣耀机器人全栈自研,将聚焦消费市场 * 马化腾凌晨 2 点发声:还有一批龙虾系产品陆续赶来 * 前快手语言大模型中心负责人张富峥,已加入智源人工智能研究院,负责 LLM 方向 * 最新全球 AI 应用百强榜发布,豆包/DeepSeek/千问上榜 * 苹果折叠 iPhone 将于九月亮相,融合 iPhone 与 iPad 体验

By Ne0inhk
不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

编译 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) “如果你周日去旧金山的咖啡馆,会发现几乎每个人都在工作。” 这是 AI 创业公司 Mythril 联合创始人 Sanju Lokuhitige 最近最直观的感受。去年 11 月,他特地搬到旧金山,只为了更接近 AI 创业浪潮的中心。但很快,他也被卷入了这股浪潮带来的另一面——一种越来越极端的工作文化。 Lokuhitige 坦言,他现在几乎每天工作 12 小时,每周 7 天。除了每周少数几场刻意安排的社交活动(主要是为了和创业者们建立联系),其余时间几乎都在写代码、做产品。 “有时候我整整一天都在编程,”他说,“我基本没有什么工作与生活的平衡。”而这样的生活,在如今的 AI 创业圈里并不算罕见。 旧金山 AI 创业圈的真实日常 一位在旧金山一家 AI

By Ne0inhk
黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

AI 究竟是什么?在 NVIDIA CEO 黄仁勋看来,它早已不只是聊天机器人或某个大模型,而是一种正在迅速成形的“新型基础设施”。 近日,黄仁勋在英伟达官网发布了一篇长文,提出一个颇具形象的比喻——AI 就像一块“五层蛋糕”。从最底层的能源,到芯片、基础设施、模型,再到最上层的应用,人工智能正在形成一整套完整的产业技术栈,并像电力和互联网一样,逐渐成为现代社会的底层能力。 这也是黄仁勋自 2016 年以来公开发表的第七篇长文。在这篇文章中,他从计算机发展史与第一性原理出发,试图解释 AI 技术栈为何会演化成如今的形态,以及为什么全球正在掀起一场规模空前的 AI 基础设施建设。 在他看来,过去几十年的软件大多是预先编写好的程序:人类设计好算法,计算机按指令执行,数据被结构化存储在数据库中,通过精确查询调用。而 AI 的出现打破了这一模式——计算机开始能够理解图像、文本和声音,并根据上下文实时生成答案、推理结果甚至新的内容。 正因为智能不再是预先写好的代码,而是实时生成的能力,支撑它运行的整个计算体系也必须被重新设计。

By Ne0inhk