建设电脑网站中国站免费推广入口
2026/2/16 4:55:51 网站建设 项目流程
建设电脑网站,中国站免费推广入口,专门做电子书的网站,企业网站建设的方式有哪些方式大家好#xff0c;我是小悟。 第一部分#xff1a;微服务是什么#xff1f;一场“分家过日子”的哲学 你开了一家超级火爆的“程序猿餐厅”#xff0c;一开始所有菜都在一个大厨房做#xff1a; 单体架构#xff1a;一个厨子#xff08;服务器#xff09;包揽所有菜我是小悟。第一部分微服务是什么一场“分家过日子”的哲学你开了一家超级火爆的“程序猿餐厅”一开始所有菜都在一个大厨房做单体架构一个厨子服务器包揽所有菜点单、炒菜、煲汤、洗碗全管客人点个蛋炒饭整个厨房都得动起来想升级蛋炒饭配方得关店装修停机部署厨子感冒了全店停业单点故障微服务就像把大厨房拆了蛋炒饭部、火锅部、奶茶部各自独立每个部门有自己的小厨房服务实例通过传菜机器人服务通信协作奶茶部炸了没事蛋炒饭照常供应故障隔离第二部分开干八步搭建SpringCloud全家桶先拜码头环境准备# 必备三件套 Java 11别用Java 8了它都退休了 Maven 3.6Java界的包工头 IDEIntelliJ IDEA - 程序员的法拉利第1步创建父工程 - 家族的“族谱”!-- pom.xml - 家族总章程 -- ?xml version1.0 encodingUTF-8? project modelVersion4.0.0/modelVersion groupIdcom.coder.micro/groupId artifactIdmicro-family/artifactId version1.0.0/version packagingpom/packaging !-- 声明SpringCloud版本 - 家族用的家规版本 -- properties spring.cloud.version2021.0.3/spring.cloud.version spring.boot.version2.7.14/spring.boot.version /properties !-- 依赖管理 - 所有子孙该用什么版本 -- dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring.cloud.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement modules moduleeureka-server/module modulegateway/module moduleorder-service/module moduleuser-service/module /modules /project第2步Eureka服务注册中心 - 家族的“户口本”# 想象成家族微信群 # 谁在服务上线所有人 # 谁睡了服务下线改备注 # 谁失联了心跳检测踢出群// EurekaServerApplication.java - 户口本管理员 SpringBootApplication EnableEurekaServer // 开启户口本功能 public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } // application.yml - 户口本配置 server: port: 8761 # 户口本办公室门牌号 eureka: client: register-with-eureka: false # 户口本不用自己登记自己 fetch-registry: false # 不用拉取别人的信息 server: eviction-interval-timer-in-ms: 30000 # 30秒检查一次谁失联了第3步API网关 - 家族的“前台小姐姐”// GatewayApplication.java SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } } // Gateway配置 - 前台路由规则 spring: cloud: gateway: routes: - id: order-service # 找点单部的路 uri: lb://ORDER-SERVICE # lb负载均衡像电梯分流入流 predicates: - Path/api/orders/** # 所有/orders开头的请求 - id: user-service # 找会员部的路 uri: lb://USER-SERVICE predicates: - Path/api/users/** # 全局过滤器 - 前台的小本本 default-filters: - AddRequestHeaderX-Request-From, gateway # 给每个请求盖个章第4步订单服务 - 家族的“点单部”// OrderServiceApplication.java SpringBootApplication EnableEurekaClient // 大喊一声我上线了 EnableFeignClients // 开启“打电话”功能 public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } } // OrderController.java - 点单部接待处 RestController RequestMapping(/orders) Slf4j public class OrderController { Autowired private UserServiceClient userServiceClient; // 用户部的联系电话 PostMapping public OrderDTO createOrder(RequestBody OrderRequest request) { log.info(接到新订单{}, request); // 打个电话问用户部这人是不是VIP UserDTO user userServiceClient.getUser(request.getUserId()); if (user.isVip()) { log.info(VIP用户加急处理); return processVipOrder(request); } return processNormalOrder(request); } // 假装这里有很多业务逻辑... private OrderDTO processVipOrder(OrderRequest request) { return OrderDTO.builder() .orderId(UUID.randomUUID().toString()) .status(VIP_优先处理) .message(老板您的订单已插队) .build(); } }第5步用户服务 - 家族的“会员部”// UserController.java RestController RequestMapping(/users) Slf4j public class UserController { // 用户部的VIP名单 private MapString, UserDTO userDatabase new HashMap(); PostConstruct public void init() { userDatabase.put(1001, new UserDTO(1001, 张大款, true)); userDatabase.put(1002, new UserDTO(1002, 李铁柱, false)); } GetMapping(/{userId}) public UserDTO getUser(PathVariable String userId) { log.info(查询用户{}, userId); // 模拟网络延迟 try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return userDatabase.getOrDefault(userId, new UserDTO(userId, 未知用户, false)); } }第6步服务间通信 - 家族的“内部电话系统”// UserServiceClient.java - 订单部用来呼叫用户部的电话 FeignClient(name USER-SERVICE) // 声明要呼叫的服务名 public interface UserServiceClient { GetMapping(/users/{userId}) // 电话号码和拨号方式 UserDTO getUser(PathVariable String userId); // 这就是SpringCloud的魔法 // 看起来像本地调用实际上是HTTP请求 // 像极了微信语音看似在身边实际可能隔了个太平洋 }第7步配置中心 - 家族的“公告栏”// 每个服务都要有这个配置 spring: config: import: optional:configserver:http://localhost:8888 # 看公告栏地址 cloud: config: fail-fast: false # 公告栏坏了也不影响营业 # 公告栏上写着 # order-service.yml: # 优惠活动双十一打五折 # 超时时间30秒 # # user-service.yml: # VIP门槛消费满10000 # 签到积分10分/天第8步熔断降级 - 家族的“应急方案”// OrderService中调用用户服务时 FeignClient(name USER-SERVICE, fallback UserServiceFallback.class) // 备胎方案 public interface UserServiceClient { // ... } // 用户部失联时的备胎方案 Component Slf4j public class UserServiceFallback implements UserServiceClient { Override public UserDTO getUser(String userId) { log.warn(用户服务失联启用默认用户信息); // 返回兜底数据保证订单服务不崩溃 return UserDTO.builder() .userId(userId) .username(默认用户) .vip(false) .fromFallback(true) // 标记这是备胎数据 .build(); } }第三部分启动全家桶的“开机仪式”# 启动顺序很重要像玩多米诺骨牌 1. 启动户口本Eureka Server cd eureka-server mvn spring-boot:run # 访问 http://localhost:8761 看谁在线 2. 启动会员部User Service cd user-service mvn spring-boot:run # 在Eureka页面应该能看到USER-SERVICE 3. 启动点单部Order Service cd order-service mvn spring-boot:run 4. 启动前台Gateway cd gateway mvn spring-boot:run # 测试一下 curl http://localhost:8080/api/orders \ -X POST \ -H Content-Type: application/json \ -d {userId: 1001, productId: P001} # 应该返回VIP订单已插队第四部分微服务开发的“生存法则”1. 服务拆分原则 - “分家不分心”// 好的拆分按业务能力 - 订单服务管下单、支付、退款 - 库存服务管商品库存 - 物流服务管配送 // 坏的拆分按技术层 - Controller服务只放Controller // 别这么干 - Service服务只放Service // 这是给自己挖坑 - DAO服务只放DAO // 你会哭的2. 数据库设计 - “各管各的账”-- 订单服务有自己的订单表 CREATE TABLE orders ( id VARCHAR(32) PRIMARY KEY, user_id VARCHAR(32), -- 只存用户ID不存用户详情 amount DECIMAL(10, 2) -- 不在这里创建user表的外键这是微服务大忌 ); -- 用户服务有自己的用户表 CREATE TABLE users ( id VARCHAR(32) PRIMARY KEY, name VARCHAR(100), vip_level INT -- 不知道订单表的存在各过各的 );3. 分布式事务 - “家族的信任危机”// 使用Seata处理分布式事务 GlobalTransactional // 分布式事务注解 public void placeOrder(OrderRequest request) { // 1. 扣库存调用库存服务 inventoryService.reduceStock(request.getProductId()); // 2. 创建订单 orderService.createOrder(request); // 3. 扣款调用支付服务 paymentService.deductBalance(request.getUserId()); // 任何一步失败所有操作都会回滚 // 像极了要么全部成功要么全部撤销 }总结微服务之路的苦与乐你得到的“超能力”独立部署改个按钮颜色不用重启整个系统技术异构订单用Java推荐用Python数据分析用Go弹性伸缩双十一给订单服务多加10台机器容错性推荐服务挂了商品详情页照样能打开你面临的“挑战”分布式debug找bug像侦探破案线索分布在5个服务里网络延迟本地方法调用1ms服务间调用可能100ms数据一致性用户余额减少了订单却没创建成功运维复杂度原来管1个应用现在要管20个服务最后微服务不是银弹是银制餐具适合大型团队各自做饭不打架适合快速迭代各部分独立升级适合复杂系统分而治之但如果你只是开个煎饼摊一个平锅单体应用够了非要搞5个小灶微服务光协调哪个摊鸡蛋哪个撒葱花就够你受的微服务解决的是人的问题不是技术的问题。当团队大到需要分山头、业务复杂到需要分领域时才是微服务登场的最佳时机。否则你就是用导弹打蚊子——效果震撼但真的没必要代码世界的真理没有最好的架构只有最合适的架构。微服务不是终点而是你架构演化路上的一个里程碑。创建第一个微服务记得先从小处着手毕竟罗马不是一天建成的微服务也不是一次拆完的谢谢你看我的文章既然看到这里了如果觉得不错随手点个赞、转发、在看三连吧感谢感谢。那我们下次再见。您的一键三连是我更新的最大动力谢谢山水有相逢来日皆可期谢谢阅读我们再会我手中的金箍棒上能通天下能探海

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询