后端系统可扩展性设计:从核心原则到实战架构的完整指南

kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev 找不到replicas命令 按照网上教程中直接部署3个pod发现找不到命令??? [root@master1 ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev Error: unknown flag: --replicas See 'kubectl run --help' for usage. 这个问题还是因为k8s版本的问题。 新版本中命令发生了一些改变(网上查阅是1.18版本之后... 阅读详情

为什么很多后端项目初期跑得飞快,一到用户量翻倍就频繁宕机、响应超时?为什么有些团队总在“重构-上线-再重构”的循环里打转?问题的根源往往不在代码细节,而在于架构设计之初就埋下的隐患——系统缺乏可扩展性。

今天我们不谈那些高深莫测的理论,就从最实际的场景出发:当你接手一个新项目,或者从零开始设计一个系统时,如何从一开始就为未来的增长留出空间?这篇文章将为你拆解可扩展系统设计的核心原则、常见模式与落地实践。读完它,你将能清晰地判断一个架构的扩展潜力,并掌握一套从设计到编码的实操方法,避免让你的系统在业务爆发时成为瓶颈。

1. 可扩展性:不只是加机器那么简单

很多人一提到“可扩展”,第一反应就是“堆硬件”——用户多了就加服务器,数据大了就升级数据库。这其实是一个巨大的误区。单纯的垂直扩展(Scale Up)成本高昂且存在天花板,而真正的可扩展性设计,追求的是水平扩展(Scale Out)的能力,即通过增加廉价的、标准化的节点来提升整体容量。

可扩展系统的核心目标 是:在业务量和数据量增长时,系统能够通过增加资源(通常是水平增加)来保持稳定的性能、可用性和可维护性,同时成本增长是线性的,甚至是亚线性的。

一个常见的反面教材是:一个 monolithic(单体)应用,所有模块耦合在一起,数据库也是单点。当并发请求从100 QPS增长到10000 QPS时,你会发现加再多服务器也没用,因为瓶颈卡在了那个唯一的数据库连接上。这时,任何改动都牵一发而动全身,所谓的“扩展”变成了推倒重来。

因此,设计可扩展系统的第一步,是建立正确的认知:它是一系列设计原则和架构模式的组合,目的是让系统像乐高积木一样,可以方便地“拼接”出更大的能力,而不是打造一个无法分割的“巨石”。

2. 核心设计原则:为变化而设计

可扩展性不是某个具体功能,而是渗透在架构每个角落的基因。以下是几个必须遵循的核心原则:

2.1 单一职责与高内聚低耦合

这是软件工程的基石,更是可扩展性的前提。每个服务、每个模块、甚至每个类,都应该只有一个引起它变化的原因。高内聚意味着相关功能集中在一起;低耦合意味着模块之间的依赖最小化。这样,当某个业务需要扩展时,你可以独立地扩容负责该业务的模块,而不影响其他部分。

2.2 无状态设计

对于服务而言,无状态是实现水平扩展的黄金法则。任何一次请求的处理都不应依赖之前请求留在本机内存中的数据。会话(Session)信息应该外置到共享存储中,如 Redis 或数据库。这样,任何请求都可以被集群中的任意一台服务器处理,负载均衡器可以自由地分发流量。

// 反面教材:将用户购物车存在本地HttpSession中
HttpSession session = request.getSession();
List<CartItem> cart = (List<CartItem>) session.getAttribute("CART");
// 当用户下次请求被路由到另一台服务器时,购物车数据丢失

// 正确做法:使用外部缓存(如Redis)存储会话状态
String sessionId = getSessionIdFromCookie(request);
String cartKey = "cart:" + sessionId;
List<CartItem> cart = redisTemplate.opsForList().range(cartKey, 0, -1);
// 无论请求到哪台服务器,都能获取到正确的购物车数据

2.3 异步化与最终一致性

不是所有操作都需要实时、强一致。将耗时操作(如发送邮件、生成报表、数据清洗)异步化,放入消息队列(如 RabbitMQ, Kafka),由后台消费者处理,可以瞬间释放Web线程,大幅提高接口响应能力和系统吞吐量。接受数据的最终一致性,是换取系统可用性和扩展性的重要权衡。

2.4 设计面向失败

分布式系统中,故障是常态而非例外。可扩展系统必须假设网络会延迟、节点会宕机、磁盘会损坏。因此,需要引入熔断(Circuit Breaker)、降级(Fallback)、重试(Retry with backoff)等弹性模式。例如,使用 Resilience4j 或 Hystrix 来保护服务调用。

# 示例:Resilience4j 熔断器配置 (application.yml)
resilience4j.circuitbreaker:
  instances:
    backendService:
      register-health-indicator: true
      sliding-window-size: 10
      minimum-number-of-calls: 5
      permitted-calls-in-half-open-state: 3
      automatic-transition-from-open-to-half-open-enabled: true
      wait-duration-in-open-state: 5s
      failure-rate-threshold: 50

3. 分层与模块化:架构的骨架

一个清晰的分层是控制复杂性的基础。经典的 三层架构 (表现层、业务逻辑层、数据访问层)仍然是最实用的起点。

用户请求 -> [API网关/负载均衡] -> [Web服务器集群] -> [应用服务集群] -> [缓存集群] -> [数据库集群]
          (流量分发)          (无状态处理)      (核心业务)         (热点数据)      (持久化存储)

对于更复杂的系统, 微服务架构 是模块化的终极体现。它将一个大型单体应用拆分为一组小型、独立的服务,每个服务围绕特定业务能力构建,拥有独立的数据库,并通过轻量级通信机制(如 HTTP/REST, gRPC)协作。

关键决策点:何时采用微服务?

  • 不适合 :团队规模小(<10人)、业务复杂度低、快速验证阶段。微服务带来的分布式复杂性(网络、事务、监控)会拖慢你。
  • 适合 :大型团队需要独立开发部署、不同业务模块技术栈差异大、部分服务需要极高的可扩展性或可用性。

4. 数据层的可扩展设计:真正的瓶颈所在

应用服务器可以轻松水平扩展,但数据层往往是最后的瓶颈。以下是关键策略:

4.1 数据库读写分离

将写操作指向主库(Master),读操作指向一个或多个从库(Slave)。这极大地提升了读性能。许多框架(如 MyBatis-Plus, ShardingSphere)可以透明地实现读写分离。

// 使用注解或配置来暗示读写操作(示例为概念性代码)
@Service
public class UserService {
    @Master // 自定义注解,表示走主库
    public void createUser(User user) {
        userMapper.insert(user);
    }

    @Slave // 自定义注解,表示走从库
    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }
}

4.2 分库分表

当单表数据量巨大(如千万级以上)时,查询和写入性能都会急剧下降。分库分表通过将数据分散到多个数据库或表中,来解决单点瓶颈。

  • 垂直分库 :按业务模块拆分数据库。例如,用户库、订单库、商品库。
  • 水平分表 :将同一个表的数据按某种规则(如用户ID哈希、时间范围)拆分到多个结构相同的表中。

分片键的选择至关重要 ,它决定了数据分布的均匀性和查询的效率。应选择值分布均匀、高频查询使用的字段。

-- 假设对`order`表按`user_id`进行水平分表,分为4张表
-- 原始表名:order
-- 分表后表名:order_0, order_1, order_2, order_3
-- 分表规则:table_suffix = user_id % 4

-- 查询用户123的订单,会自动路由到 order_3 (123 % 4 = 3)
SELECT * FROM order WHERE user_id = 123;
-- 框架或中间件会将其重写为:SELECT * FROM order_3 WHERE user_id = 123;

4.3 引入多级缓存

缓存是提升读性能、降低数据库压力的利器。构建一个多级缓存体系:

  1. 本地缓存(L1) :如 Caffeine、Guava Cache。速度极快,但容量小,且集群间数据不一致。适合极少变更的数据。
  2. 分布式缓存(L2) :如 Redis、Memcached。容量大,数据全局一致,但存在网络开销。适合热点数据。
  3. 数据库缓存 :如 MySQL 的 Buffer Pool。

缓存策略(Cache Aside, Read/Write Through, Write Behind)和缓存失效(失效、更新)的设计同样关键。

5. 通信与集成的可扩展性

服务或模块间的通信方式直接影响系统的耦合度和扩展能力。

5.1 同步调用 vs. 异步消息

  • 同步调用(REST, gRPC) :简单直观,但调用方会阻塞等待,存在级联失败风险。适用于需要立即响应的核心流程。
  • 异步消息(消息队列) :解耦生产者和消费者,支持削峰填谷,提高系统韧性。适用于日志处理、事件通知、耗时任务。

推荐模式 :核心链路用同步,确保事务;周边链路用异步,提升整体吞吐。

5.2 API 设计规范

良好的 API 是服务可扩展的契约。遵循 RESTful 风格,使用清晰的资源命名,利用 HTTP 状态码,设计版本化 API(如 /api/v1/users ),并为未来可能的变更设计兼容的响应格式。

6. 实战:设计一个可扩展的用户订单系统

假设我们要设计一个电商平台的用户订单模块,预期未来会有海量用户和订单。

6.1 架构概览

我们采用微服务架构,将系统拆分为:

  • 用户服务 (User-Service) :管理用户信息、登录鉴权。
  • 商品服务 (Product-Service) :管理商品信息、库存。
  • 订单服务 (Order-Service) :核心业务,处理下单、支付、发货逻辑。
  • API 网关 (API-Gateway) :统一入口,负责路由、认证、限流。
  • 配置中心 & 注册中心 :使用 Nacos 或 Consul 进行服务发现和配置管理。
  • 消息队列 :使用 RabbitMQ 处理下单成功后的异步任务(如发短信、更新积分)。

6.2 核心流程与代码示例:下单流程

1. 服务定义与接口(Order-Service)

// OrderService.java 接口
public interface OrderService {
    OrderDTO createOrder(CreateOrderRequest request);
    OrderDTO getOrder(Long orderId, Long userId);
    PageResult<OrderDTO> listUserOrders(Long userId, Integer page, Integer size);
}

// CreateOrderRequest.java 请求对象
@Data
public class CreateOrderRequest {
    @NotNull
    private Long userId;
    @NotEmpty
    private List<OrderItemRequest> items;
    private Long couponId;
}

2. 下单业务逻辑实现

// OrderServiceImpl.java
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
    @Autowired
    private ProductServiceClient productServiceClient; // Feign 客户端
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public OrderDTO createOrder(CreateOrderRequest request) {
        // 1. 参数校验(略)
        // 2. 调用商品服务,验证库存并预扣减(分布式事务 Saga/TCC模式,此处简化)
        Boolean lockResult = productServiceClient.lockStock(request.getItems());
        if (!lockResult) {
            throw new BusinessException("库存不足");
        }

        // 3. 生成订单号(分布式ID生成,如雪花算法)
        String orderNo = IdGenerator.nextId();

        // 4. 组装订单数据并持久化
        Order order = new Order();
        order.setOrderNo(orderNo);
        order.setUserId(request.getUserId());
        order.setStatus(OrderStatus.CREATED.getCode());
        order.setTotalAmount(calculateTotal(request.getItems()));
        orderMapper.insert(order); // 写入分库分表后的订单主表

        // 5. 发送订单创建成功事件到消息队列(异步解耦)
        OrderCreatedEvent event = new OrderCreatedEvent(order.getId(), order.getUserId());
        rabbitTemplate.convertAndSend("order.exchange", "order.created", event);

        log.info("订单创建成功,订单号:{}", orderNo);
        return convertToDTO(order);
    }
}

3. 消息消费者处理异步任务

// OrderEventListener.java
@Component
@Slf4j
public class OrderEventListener {
    @Autowired
    private SmsService smsService;
    @Autowired
    private UserPointService userPointService;

    @RabbitListener(queues = "order.created.queue")
    public void handleOrderCreatedEvent(OrderCreatedEvent event) {
        log.info("收到订单创建事件,订单ID:{}", event.getOrderId());
        try {
            // 1. 发送下单成功短信(可重试)
            smsService.sendOrderSuccessSms(event.getUserId(), event.getOrderId());
            // 2. 增加用户积分(最终一致性)
            userPointService.addPointsForOrder(event.getUserId(), event.getOrderId());
        } catch (Exception e) {
            log.error("处理订单创建事件失败, orderId: {}", event.getOrderId(), e);
            // 此处应进入死信队列或人工处理
        }
    }
}

6.3 数据库与缓存设计

订单表分表策略 :按 user_id 进行哈希分表,例如分 64 张表。使用 ShardingSphere 等中间件透明化管理。

缓存设计 :

  • 热点订单查询 :订单创建后,将 OrderDTO 对象以 order:{orderId} 为 key 写入 Redis,设置过期时间(如30分钟)。
  • 用户订单列表 :以 user_orders:{userId}:{page} 为 key 缓存分页结果,当用户新增订单时,删除该用户相关的列表缓存。
// 带缓存的订单查询服务
@Service
public class OrderQueryService {
    @Autowired
    private RedisTemplate<String, OrderDTO> redisTemplate;
    @Autowired
    private OrderMapper orderMapper;

    public OrderDTO getOrderWithCache(Long orderId, Long userId) {
        String cacheKey = "order:" + orderId;
        // 1. 先查缓存
        OrderDTO cachedOrder = redisTemplate.opsForValue().get(cacheKey);
        if (cachedOrder != null) {
            // 简单权限校验:缓存中的订单是否属于当前用户
            if (userId.equals(cachedOrder.getUserId())) {
                return cachedOrder;
            }
        }
        // 2. 缓存未命中,查数据库
        OrderDTO orderFromDB = orderMapper.selectOrderByIdAndUserId(orderId, userId);
        if (orderFromDB != null) {
            // 3. 回填缓存
            redisTemplate.opsForValue().set(cacheKey, orderFromDB, 30, TimeUnit.MINUTES);
        }
        return orderFromDB;
    }
}

7. 基础设施与运维支撑

没有好的运维,再好的架构也无法扩展。

7.1 监控与告警

  • 应用监控 :使用 APM 工具(如 SkyWalking, Pinpoint)监控服务链路、JVM 状态、慢 SQL。
  • 系统监控 :使用 Prometheus + Grafana 监控服务器 CPU、内存、磁盘、网络。
  • 日志聚合 :使用 ELK(Elasticsearch, Logstash, Kibana)或 Loki 集中管理日志。
  • 业务监控 :监控核心业务指标,如订单创建成功率、支付成功率、接口 QPS。

7.2 持续集成与持续部署 (CI/CD)

自动化构建、测试和部署流程,是实现快速、安全扩展的保障。使用 Jenkins、GitLab CI 或 GitHub Actions,确保每次变更都能快速、一致地发布到生产环境。

7.3 配置中心化

将数据库连接、缓存地址、开关配置等从代码中剥离,存入配置中心(如 Nacos, Apollo)。这样,在扩容时,新节点能自动获取配置,无需修改代码和重启服务。

8. 常见问题与排查思路

问题现象 可能原因 排查方式 解决方案
新增服务器后,负载不均,部分服务器压力大 负载均衡策略不合理(如IP哈希),或服务实例健康状态不一致。 1. 检查负载均衡器(如Nginx)配置。
2. 检查注册中心,确认所有实例状态均为UP。
3. 查看各实例的监控指标。
1. 将负载均衡策略改为轮询或最小连接数。
2. 修复不健康的服务实例。
3. 确保应用是无状态的。
数据库CPU持续100%,响应慢 1. 慢查询。
2. 未命中索引。
3. 缓存失效导致大量请求穿透到DB。
1. 查看数据库慢查询日志。
2. 使用 EXPLAIN 分析关键SQL。
3. 检查缓存命中率监控。
1. 优化SQL,添加索引。
2. 引入或优化缓存策略。
3. 考虑读写分离或分库分表。
消息队列积压,消费者处理不过来 1. 消费者处理能力不足。
2. 消息处理逻辑中有阻塞或异常。
3. 生产者流量激增。
1. 查看队列长度监控。
2. 检查消费者日志是否有大量错误。
3. 分析消费者处理单条消息的耗时。
1. 增加消费者实例(水平扩展)。
2. 优化消费者处理逻辑,改为批量处理。
3. 对生产者进行限流。
服务调用超时,出现级联故障 1. 下游服务响应慢或宕机。
2. 网络波动。
3. 未设置合理的超时和熔断。
1. 查看链路追踪,定位慢调用节点。
2. 检查下游服务健康状态和资源使用率。
3. 检查熔断器状态。
1. 优化下游服务性能。
2. 配置调用超时(如2s)、重试和熔断策略。
3. 实现服务降级,返回兜底数据。
分库分表后,跨分片查询效率极低 查询条件中未包含分片键,导致需要扫描所有分片。 分析业务查询SQL,确认是否都带了分片键(如 user_id )。 1. 重构查询,确保带上分片键。
2. 建立全局二级索引(如通过ES同步数据)。
3. 重新评估分片键的选择。

9. 最佳实践与工程建议

  1. 渐进式演进 :不要一开始就追求完美的微服务或复杂的分库分表。从清晰的单体模块化开始,当遇到具体瓶颈(如数据库压力、团队协作冲突)时,再针对性地拆分。
  2. 容量规划与压测 :定期进行压力测试,了解系统的瓶颈点和最大承载能力。根据业务增长预测,提前规划资源扩容。
  3. 标准化与自动化 :服务器配置、部署脚本、监控告警规则都应标准化并通过代码(Infrastructure as Code)管理。自动化能减少人为错误,提高扩展效率。
  4. 设计时考虑降级 :明确核心功能和非核心功能。在系统压力过大时,应有预案可以暂时关闭非核心功能(如商品评论、推荐列表),保障核心交易链路畅通。
  5. 文档与知识沉淀 :架构图、部署手册、应急预案、故障复盘报告必须持续更新和共享。可扩展的系统也需要可扩展的团队认知。

设计可扩展的后端系统,是一场在简单与复杂、性能与成本、当下与未来之间的持续权衡。没有银弹,只有适合当前和可预见未来场景的最佳选择。核心在于建立一种“弹性”思维:你的每一个设计决策,是否都为未来的变化留出了一条相对平滑的演进路径?从今天起,在写下一行代码、设计下一个接口时,多问一句:“如果流量增长10倍,这里会怎么样?” 这种前瞻性的思考,正是优秀架构师与普通开发者的分水岭。

PyCharm进行 FLASK开发 环境 问题 PORT HOST DEBUG 设置 PyCharm ’‘‘python flask from flask import Flask app = Flask(name) @app.route(’/’) def hello_world(): return ‘Hello World!’ if name == ‘main’: app.run() ’‘’ 阅读详情

相关推荐

库卡机器人负载设置和自动负载测算

1.1在专家或者以上的权限下—“投入运行”——“工具/基座标管理”—“工具/工件”—添加1.2根据当前的工具所在的tool选择指定工具号;若是没有建立tool需要先建立建立方法看1.3负载数据的填写质量:抓手自重+产品重量总和(需要小于额定负载值)X、Y、Z :总质量的重心位置(基于法兰盘中心的位置计算,如下图的X_FLANGE、Y_FLANGE、Z_FLANGE)【此数据可以根据仿真或者CAD数据得出】A、B、C:是总质量绕着法兰盘中心所安装的角度位置 【此数据可以根据仿真或者CAD数据得出】

weixin_43462131的博客 3099

run 80 port

run 80 port when you want run a server on 80 port your need root permissionhttp://stackoverflow.com/questions/550032/what-causes-pyth...

87

告别信息过载:我是如何用Feedly RSS阅读器打造个人专属信息流的(附Chrome插件使用技巧)

本文分享了如何利用Feedly RSS阅读器有效管理信息过载,打造个人专属信息流的方法。通过科学组织订阅源、智能过滤和跨平台同步技巧,帮助用户从被动接收转为主动筛选,提升信息获取效率。特别推荐使用Feedly的Chrome插件和AI过滤功能,实现高效的信息管理。

weixin_42526015的博客 354

Run tomcat on port 80 not 8080

How to run Tomcat on Port 80 A standard Tomcat installation starts the webserver on port 8080 – which is usually not the desired behavior. In order to change the server to port 80 there are two optio...

weixin_30682127的博客 126

SAP S/4HANA 可扩展性 – 面向初学者的简化指南

可扩展性(Extensibility)是 SAP ECC 和 SAP S/4HANA 的一项关键功能。它使客户能够通过定制其业务流程来创造竞争优势,并使合作伙伴能够通过量身定制的解决方案来丰富核心 ECC 或 S/4HANA。在过去的几十年中,SAP 的 on-premise 版本客户和合作伙伴主要使用经典的 ABAP 扩展性来扩展他们的 ERP 解决方案。经典扩展性允许 ABAP 开发人员使用甚至修改所有 SAP 对象。尽管经典扩展性非常强大和灵活,但在当今的云世界中,它已不再是一个好的选择。

SAP学习成长之路的博客 1808

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 89

run application on linux port 80 as non-root user.

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34007886的博客 325

时间序列预测 | 决策树时间序列预测建模,单步、多步(Python)

时间序列预测 | 决策树时间序列预测建模,单步、多步(Python)

天天酷科研的博客 743

jetty:run -Plocal -Djetty.port=80

maven使用jetty 命令。

shersfy的专栏 778

帆软报表导出各种格式之后台导出

我们前面介绍了帆软报表在界面上的导出是通过类似的URL:http://localhost:8075/webroot/decision/view/report?op=export&sessionID=10653244-3e46-408c-bc54-f89a214a9bc7&format=image&extype=PNG 来完成的,就是带OP=export以及format参数来完成的。如果不从界面传参数,比如我们自己实现了一个HTTP接口,也可以通过传参数format来完成各种格式的导

帆软爱好者的专栏 4268

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1085

mvn tomcat7启动 Eclipse

tomcat7:run -Dmaven.tomcat.port=80

683

从零开始学习CANoe(三)—— 系统变量的创建和使用

从零开始学习CANoe(三)—— 系统变量的创建和使用

蚂蚁小兵 1万+

使用:kubectl run nginxweb --image=nginx --port=80 --replicas=3 报错;

执行:kubectl run nginxweb --image=nginx --port=80 --replicas=3时会报错,反馈:Error: unknown flag: --replicas See 'kubectl run --help' for usage. 百度后:说是k8sv1.18.0以后的版本, --replicas以弃用该命令,推荐使用deployment创建pods. 但是我的版本时v1.17.0在使用 --replicas时也是报错,我的1.17版本也无法使用该命令,只能通过使

nmxiaocui的博客 1645

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

docker run 报错 Bind for 0.0.0.0:80 failed: port is already allocated.解决方案

出现这种情况可能是docker容器没有run起来,获取资源不够,多次执行,就会导致这种情况。 查看docker 代理占用的端口 ps -aux | grep -v grep | grep docker-proxy 关闭docker 服务 sudo service docker stop ### 重启docker服务 sudo service docker start 还不行的话就 docker rm $(docker ps -aq) sudo rm /var/lib/docker/network

知无涯 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jetty 插件指定端口

jetty:run -Djetty.port=80 默认8080

linbren的专栏 3245

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

webpack配置devServer节点

cmd中运行npm run dev后自动打开首页

weixin_42541725的博客 206

jetty启动

-Pjetty jetty:run  -Djetty.port=80

jijiaa12345的专栏 117

docker 部署静态网站

1.  dock r run -p 80 --name=web -i -t ubuntu /bin/bash     -p  指该容器的映射端口号为80 2.  将nginx运行起来        查看容器内进程情况:     3.  查看是否部署成功     docker port 容器 查询容器端口对应宿主机端口     宿主机直接127.0.0.1:宿主机端口号 ...

weixin_30307921的博客 439

minikube:部署一个nginx应用

通过run命令运行pod 创建pod minikube kubectl -- run nginx --image=nginx --port=80 查看pod的ip minikube kubectl -- get pods -o wide 遇到查看不到IP的问题可以重启minikube 登录集群 minikube ssh 连接nginx curl ip ...

qq_40378795的博客 1685

OS X - 在80端口启动Nginx

不知道你是怎么在你的mac上安装nginx的,但是如果你跟我一样: brew install nginx 然后你会发现你的nginx.conf中的端口是8080。 于是你可能像我一样试着把端口改为80,然后reload一下。 你发现没有任何错误提示,当你访问localhost时却没有nginx的首页,甚至连403也没有。 于是你尝试... sudo lso...

dengtangu7674的博客 146

部署应用到K8s集群(未完)

3.1如果访问不了,把节点的服务器安全组把80端口打开。(等熟悉一番再来写,因为按小时结算的。2、将本地机器的80端口转发到集群中名为。3、访问节点的公网ip ,

肥茹的博客 457

mac vue-cli启用80端口

1、需要指定port为80 2、需要sudo npm run dev,才可以

litCabbage的博客 1237

docker deploy rancher

docker run --privileged -d --name rancher --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:latest

GP0000968523的专栏 565
上一篇: 遥感智能体:AI自主化如何革新地理空间数据分析
下一篇: Meta WildArtifactBench:评测多模态大模型在复杂真实图像上的理解能力
mlzboy
博客等级 码龄22年 19粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值