首页 > 其他分享 >记一次港交所的线上面试

记一次港交所的线上面试

时间:2024-08-03 17:26:09浏览次数:13  
标签:一次 HTTP Nginx Spring public 面试 港交所 架构 Gateway

RPC与HTTP Client的关系

RPC(远程过程调用)和HTTP Client是两种不同的网络通信技术,它们在分布式系统中用于实现不同服务之间的交互,但它们的设计哲学、使用场景和通信方式存在差异。

RPC(Remote Procedure Call)

  • 概念:RPC是一种编程模型,允许一台计算机上的程序调用另一台计算机上的程序,而使得开发者无需额外地为这个远程通信过程编程。
  • 目的:RPC的主要目的是让远程函数调用看起来像本地函数调用一样简单。
  • 通信方式:RPC可以是基于多种不同的协议实现的,比如TCP、UDP,或者是HTTP。
  • 数据传输:RPC通常使用二进制格式传输数据,效率较高。
  • 常见实现:例如gRPC、Thrift、Dubbo等。

HTTP Client

  • 概念:HTTP Client是遵循HTTP协议的客户端,用于向HTTP服务器发送请求并接收响应。
  • 目的:主要用于Web服务,通过HTTP/HTTPS协议进行网络资源的请求和获取。
  • 通信方式:基于HTTP协议,使用请求-响应模式。
  • 数据传输:HTTP Client通常使用文本格式(如JSON、XML)传输数据,可读性较好,但相对于二进制格式,传输效率略低。
  • 常见实现:例如Apache HttpClient、Java的HttpURLConnection、cURL等。

RPC与HTTP Client的关系

  • 相同点

    • 都可以实现服务间的远程通信。
    • 都可以用于构建分布式系统。
  • 不同点

    • 协议:RPC不限于HTTP协议,而HTTP Client专门用于HTTP协议。
    • 抽象程度:RPC提供了比HTTP更高层次的抽象,它隐藏了网络通信的细节,让远程调用看起来像本地调用一样;HTTP Client则需要明确处理HTTP请求和响应。
    • 性能:一般来说,RPC框架在性能上进行了优化,数据序列化/反序列化效率更高,适合在对性能有高要求的系统中使用。
    • 使用场景:RPC更适合内部服务之间的通信,而HTTP Client更适合互联网服务之间的通信。

在某些情况下,RPC也可以使用HTTP作为传输协议(例如,gRPC使用HTTP/2),这种情况下,RPC和HTTP Client的关系更加紧密,但它们的本质和应用场景依然是不同的。在选择使用RPC还是HTTP Client时,应根据实际的项目需求和通信特点来决定。

Nginx 与 Spring Gateway 的关系

Nginx 和 Spring Gateway 都是用于处理网络请求的服务器软件,但它们的设计理念、应用场景和技术栈有所不同。

Nginx

  • 概念:Nginx 是一个高性能的 HTTP 和反向代理服务器,也可以用作邮件代理服务器。
  • 用途:它主要用于负载均衡、反向代理、静态内容服务、缓存、安全控制等功能。
  • 特点
    • 高并发处理能力,适合处理大量的网络请求。
    • 配置简单,性能优化能力强。
    • 可以作为Web服务器,也可以作为应用服务器的反向代理。
    • 支持多种协议,如 HTTP、HTTPS、TCP、UDP 等。

Spring Gateway

  • 概念:Spring Gateway 是 Spring Cloud 生态中的一个组件,用于提供一种简单有效的方式来路由到API,并为微服务架构提供一种API网关服务。
  • 用途:主要用于微服务架构中,作为API网关,进行路由转发、负载均衡、权限校验、限流熔断等。
  • 特点
    • 基于Spring生态系统,与Spring Boot、Spring Cloud等框架集成良好。
    • 提供基于过滤器的路由机制,易于扩展。
    • 可以利用Spring生态中的各种组件进行功能增强,如Spring Security进行安全控制。
    • 支持服务发现与配置管理。

Nginx 与 Spring Gateway 的关系

  • 相同点

    • 都可以用于处理HTTP请求,进行请求的路由和转发。
    • 都可以实现负载均衡,提高系统的可用性和扩展性。
  • 不同点

    • 技术栈:Nginx 是基于 C 语言开发的,而 Spring Gateway 是基于 Java 语言开发的。
    • 集成性:Spring Gateway 更容易与 Spring 生态系统中的其他组件集成,而 Nginx 需要额外的配置或第三方模块来实现类似功能。
    • 配置方式:Nginx 使用配置文件进行配置,而 Spring Gateway 可以通过代码或配置文件进行配置,通常更易于与Spring Boot应用的配置管理集成。
    • 性能:Nginx 在处理静态内容和大量并发请求方面通常具有更好的性能。
    • 功能:Spring Gateway 提供了更丰富的内置功能,如服务发现、熔断器、限流等,这些在 Nginx 中可能需要通过第三方模块或配合其他服务来实现。

在微服务架构中,Nginx 和 Spring Gateway 常常可以一起使用。例如,可以使用 Nginx 作为边缘代理服务器,处理SSL终止、静态内容服务等功能,而 Spring Gateway 作为内部API网关,处理服务路由、负载均衡等微服务治理相关的功能。这种组合可以充分利用两者的优势,构建高效、可靠的服务架构。

将请求从 Nginx 转发到 Spring Gateway,需要配置 Nginx 作为反向代理服务器,将请求路由到 Spring Gateway 的实例。以下是配置 Nginx 以将请求转发到 Spring Gateway 的基本步骤:

步骤 1: 确认 Spring Gateway 地址

首先,您需要知道 Spring Gateway 的服务地址和端口。假设 Spring Gateway 运行在本地的 8080 端口上,那么服务地址将是 http://localhost:8080

步骤 2: 配置 Nginx

接下来,您需要编辑 Nginx 的配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 目录下的某个文件)。以下是配置 Nginx 作为反向代理转发请求到 Spring Gateway 的一个示例:

http {
    # 其他 HTTP 配置...

    # 定义一个服务器块
    server {
        listen 80; # 监听 80 端口

        server_name yourdomain.com; # 替换为您的域名

        # SSL 配置(如果需要)
        # ssl_certificate /path/to/ssl/certificate.pem;
        # ssl_certificate_key /path/to/ssl/privatekey.pem;

        location / {
            # 将请求转发到 Spring Gateway
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host; # 传递原始主机头
            proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链信息
            proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议

            # 其他可能需要的代理设置...
        }

        # 其他 location 块...
    }

    # 其他服务器块...
}

步骤 3: 测试配置

在重启 Nginx 之前,您应该测试配置文件以确保没有语法错误:

sudo nginx -t

步骤 4: 重启 Nginx

如果配置文件测试无误,使用以下命令重启 Nginx 以应用新配置:

sudo systemctl restart nginx

或者,如果您使用的是旧版本的 Nginx:

sudo service nginx restart

步骤 5: 测试请求

现在,当您向 Nginx 发送请求时,Nginx 应该将请求转发到 Spring Gateway。您可以通过访问配置的域名或 IP 地址来测试这一点。

例如,如果您在浏览器中访问 http://yourdomain.com/somepath,这个请求应该会被 Nginx 接收,然后转发到 Spring Gateway,Spring Gateway 再根据其配置的路由规则处理请求。

确保 Spring Gateway 正在运行,并且已经配置了相应的路由规则来处理来自 Nginx 的请求。如果一切配置正确,您应该能够通过 Nginx 顺利访问 Spring Gateway 提供的服务。

业务架构,技术架构,数据架构

业务架构、技术架构和数据架构是组织信息系统的三个关键方面,它们共同构成了企业架构的框架。以下是每个架构的定义和它们的主要关注点:

业务架构 (Business Architecture)

业务架构关注于组织的业务策略、运营模型、组织结构、业务流程、能力和治理。它旨在确保信息技术与组织的业务目标和需求保持一致。

  • 定义:业务架构是组织运作方式的描述,包括其业务策略、组织结构、关键业务流程、信息流、业务能力和资源。
  • 主要关注点
    • 业务策略与目标。
    • 业务流程和操作模型。
    • 组织结构和角色。
    • 业务能力和资源。
    • 客户、产品和服务。
    • 治理、合规性和标准。

技术架构 (Technical Architecture)

技术架构关注于支持业务架构所需的技术组件,包括硬件、软件、网络和系统管理。

  • 定义:技术架构是支持业务运作的信息技术的蓝图,它定义了硬件、软件、网络和系统管理设施的结构和配置。
  • 主要关注点
    • 硬件平台和基础设施。
    • 软件应用程序和中间件。
    • 网络通信和数据传输。
    • 数据中心和服务器的布局。
    • 技术标准和协议。
    • 安全性和灾难恢复。

数据架构 (Data Architecture)

数据架构关注于组织中数据的结构、存储、流动和处理,确保数据的质量、一致性和可用性。

  • 定义:数据架构是组织中数据的整体结构,它包括数据的定义、格式、组织、关联和存储方式。
  • 主要关注点
    • 数据模型和数据库设计。
    • 数据存储和检索方法。
    • 数据流和控制。
    • 数据质量和数据治理。
    • 数据仓库和大数据处理。
    • 数据安全和隐私。

这三个架构领域相互依赖,共同工作以支持组织的整体目标。业务架构提供了技术架构和数据架构的方向和上下文,而技术架构和数据架构则为实现业务架构提供必要的工具和数据。良好的企业架构能够确保组织的信息系统有效地支持业务需求,同时保持灵活性和可扩展性以适应未来的变化。

以下是针对业务架构、技术架构和数据架构的举例说明:

业务架构示例

假设一个在线零售商想要提高客户满意度并增加销售量。

  • 业务策略:通过提供个性化购物体验来增加客户忠诚度和销售量。
  • 组织结构:公司分为产品管理、市场营销、客户服务、物流和信息技术等部门。
  • 业务流程
    • 客户关系管理流程:收集客户数据,分析购买历史,提供个性化推荐。
    • 订单处理流程:从订单接收到发货的整个流程。
  • 业务能力:拥有高效的物流系统,能够快速处理订单和退货。
  • 治理:制定数据隐私政策,确保客户信息的安全。

技术架构示例

为了支持上述业务架构,技术架构可能包括以下组件:

  • 硬件平台:服务器集群托管在云基础设施上,提供可伸缩的计算资源。
  • 软件应用程序: -电子商务平台:用于展示产品、处理订单和客户互动。 -CRM系统:用于管理客户信息和销售渠道。
  • 网络通信
    • 使用HTTPS确保数据传输安全。
    • 内容分发网络(CDN)用于加速全球用户的内容加载速度。
  • 技术标准:采用RESTful API标准来集成不同的系统和服务。
  • 安全性
    • 防火墙和入侵检测系统保护服务器不受攻击。
    • 定期备份数据以防止数据丢失。

数据架构示例

支持上述技术架构的数据架构可能涉及以下方面:

  • 数据模型
    • 客户数据模型:包含客户姓名、地址、购买历史等字段。
    • 产品数据模型:包含产品编号、名称、价格、库存等字段。
  • 数据库设计
    • 关系型数据库:用于存储结构化数据,如客户信息和订单详情。
    • NoSQL数据库:用于存储非结构化数据,如产品评论和用户行为日志。
  • 数据流
    • 客户在网站上进行的操作(如添加到购物车)会被记录并存储在数据库中。
    • 定期将销售数据从事务数据库转移到数据仓库以进行分析。
  • 数据治理
    • 实施数据质量规则以确保数据的准确性和一致性。
    • 制定数据访问策略,确保只有授权用户可以访问敏感数据。
  • 数据仓库
    • 构建数据仓库来整合来自不同源的数据,支持复杂的报告和分析。

这些示例展示了业务架构、技术架构和数据架构是如何在实际组织中协同工作的,以支持组织的业务目标和运营需求。

微服务之间的通信

微服务之间的通信通常有两种方式:同步通信和异步通信。

同步通信

同步通信意味着客户端在发送请求后会等待服务端的响应。

RESTful API

最常用的同步通信方式是通过HTTP/HTTPS协议使用RESTful API。

示例:

假设有两个微服务:OrderService 和 CustomerService

  • OrderService 需要获取客户信息来处理订单。
// CustomerService 中的 RESTful API
@RestController
@RequestMapping("/customers")
public class CustomerController {

    @GetMapping("/{customerId}")
    public Customer getCustomerById(@PathVariable Long customerId) {
        // 返回指定ID的客户信息
    }
}
  • OrderService 调用 CustomerService 的API获取客户信息。
// OrderService 中的调用代码
@Service
public class OrderService {

    private final RestTemplate restTemplate;

    public OrderService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    public void processOrder(Long orderId, Long customerId) {
        Customer customer = restTemplate.getForObject(
            "http://customerservice/customers/" + customerId, 
            Customer.class
        );
        // 使用客户信息处理订单
    }
}
gRPC

gRPC 是一个高性能、开源的 RPC 框架,可以使用 Protocol Buffers 作为接口描述语言。

示例:

  • 定义 .proto 文件。
// customer.proto
syntax = "proto3";

service CustomerService {
  rpc GetCustomer (CustomerRequest) returns (CustomerResponse);
}

message CustomerRequest {
  int64 customer_id = 1;
}

message CustomerResponse {
  Customer customer = 1;
}

message Customer {
  int64 id = 1;
  string name = 2;
  // 其他字段
}
  • 使用 gRPC 客户端调用服务。
// 在 OrderService 中调用 CustomerService
public class OrderService {
    private final CustomerServiceGrpc.CustomerServiceBlockingStub customerServiceStub;

    public OrderService(Channel channel) {
        customerServiceStub = CustomerServiceGrpc.newBlockingStub(channel);
    }

    public void processOrder(Long orderId, Long customerId) {
        CustomerRequest request = CustomerRequest.newBuilder()
            .setCustomerId(customerId)
            .build();
        
        CustomerResponse response = customerServiceStub.getCustomer(request);
        Customer customer = response.getCustomer();
        // 使用客户信息处理订单
    }
}

异步通信

异步通信涉及消息队列和事件总线,客户端发送消息后不需要等待响应。

消息队列(如RabbitMQ、Kafka)

示例:

  • OrderService 发送一个消息到 RabbitMQ。
// OrderService 发送消息
@Service
public class OrderService {

    private final RabbitTemplate rabbitTemplate;

    public OrderService(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void createOrder(Order order) {
        // ... 创建订单逻辑
        rabbitTemplate.convertAndSend("customerExchange", "customerRoutingKey", order.getCustomerId());
    }
}
  • CustomerService 监听消息队列并处理。
// CustomerService 监听消息
@Service
public class CustomerMessageListener {

    @RabbitListener(queues = "customerQueue")
    public void handleCustomerMessage(Long customerId) {
        // 处理客户信息相关的逻辑
    }
}
事件总线(如Apache Kafka)

示例:

  • OrderService 发布一个事件到 Kafka。
// OrderService 发布事件
@Service
public class OrderService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    public OrderService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void createOrder(Order order) {
        // ... 创建订单逻辑
        kafkaTemplate.send("customerTopic", "key", order.getCustomerId().toString());
    }
}
  • CustomerService 订阅 Kafka 主题并处理事件。
// CustomerService 订阅事件
@Service
public class CustomerEventConsumer {

    @KafkaListener(topics = "customerTopic", groupId = "groupId")
    public void handleCustomerEvent(String message) {
        // 处理客户信息相关的逻辑
    }
}

这些示例展示了微服务之间如何通过同步和异步方式进行通信。在实际应用中,选择哪种通信方式取决于具体的业务需求、性能要求以及系统的设计。

标签:一次,HTTP,Nginx,Spring,public,面试,港交所,架构,Gateway
From: https://blog.csdn.net/lichunericli/article/details/140848940

相关文章

  • LeetCode面试150——238除自身以外数组的乘积
    题目难度:中等默认优化目标:最小化平均时间复杂度。Python默认为Python3。目录1题目描述2题目解析3算法原理及代码实现3.1左右乘积列表参考文献1题目描述给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积......
  • 数据类型之面试题
    1.整数拓展二进制在数字前输入0b以此类推2.浮点数拓展正常来说,c1和c2输出的小数都是0.1。那么c1就应该等于c2,但是java程序最后给到的却是错误。很明显c4要大于c3,但是java程序却给到正确。由此得出结论:浮点数是有误差的,是一种约等于,并不精确一定不要用浮点数进行大小的比......
  • 做好一次重要的汇报
    背景最近在准备了一次比较重要的汇报,发现写文档与准备汇报整个过程非常痛苦,进展也很缓慢,虽然最终也憋出了东西,但这种低效率让我感觉自己欠缺这方面的方法论。实际上类似的事情还比较常见,例如,向高层汇报、述职、商业BP、面试等场景都需要这种技能,于是决定花些时间总结一下这方面的......
  • 记录一次错误,鸿蒙网络请求因未接收到token而报错
    项目场景:一个电商平台的项目问题描述明明添加了token拦截器但是在购物车界面却还是显示没有tokenexportfunctionhttpRequestGetWithToken(url:string,params?:string):Promise<BaseResp>{//获取tokenlettokenValue=DPUtils.getValue('token')asyncgetVal......
  • 一次函数杂谈
    update2024.7.25更改内容update2024.8.1更改内容+图床更改4.一次函数4.1函数的认识函数的定义:一般地,如果在一个变化过程中有两个变量\(x\)和\(y\),并且对于变量\(x\)的每一个值,变量\(y\)者都有唯一的值与它对应,那么我们称\(y\)是\(x\)的函数,其中\(x\)......
  • 面试官:你的项目有哪些难点?
    项目难点是指在项目执行过程中遇到的具有挑战性、复杂性或不确定性的问题和障碍,这些问题可能会影响项目的进度、质量、成本和目标的实现。我这里提供一些比较常见的难点问题:具体来说。1.技术难题常见的技术难题和解决方案有以下这些:高并发请求问题:在一个短时间内有大量的用......
  • 一次获取最多 5 个逗号分隔值
    如何在API路径中动态添加值?我正在从APIjson响应中提取一些值,如下所示-values=['MP55','MP50','MP51','MP54','MP58','MP59','MP60','MP60','MP61','MP62','MP50&#......
  • 测试面试宝典(四十五)—— 怎么定位bug是APP端还是服务器端的问题?
    一、观察错误现象首先,仔细观察出现的错误现象。如果是界面显示异常、交互响应卡顿或崩溃等,可能是APP端的问题。但如果数据加载不完整、请求失败提示不明等,可能与服务器端有关。比如,APP界面元素布局混乱,很可能是APP端的布局代码出现错误;而一直提示“服务器繁忙,请稍后再......
  • 【AI绘画】Black Forest Labs 发布 Flux: 文本到图像模型的下一次飞跃
    Prompt:Extremeclose-upofasingletigereye,directfrontalview.Detailedirisandpupil.Sharpfocusoneyetextureandcolor.Naturallightingtocaptureauthenticeyeshineanddepth.Theword“FLUX”ispaintedoveritinbig,whitebrushstrok......
  • 面试官:说说Netty的零拷贝技术?
    零拷贝技术概述定义:一种减少数据拷贝和上下文切换的技术,用于提升IO传输性能。原因:传统IO操作需要在用户态和内核态之间多次拷贝数据和切换上下文,这增加了时间成本。用户态与内核态用户态:应用程序运行环境,只能访问受限资源。内核态:操作系统内核运行环境,具有高权限,能直接访......