面试题答案
一键面试服务间通信方式
- RESTful API:
- 特点:基于HTTP协议,具有良好的可读性和可维护性,易于理解和使用,在微服务架构中广泛应用。不同语言开发的微服务都能方便地通过HTTP请求调用。
- 示例:使用Spring Boot开发的微服务可以轻松通过
@RestController
注解暴露RESTful接口,如@GetMapping("/users/{id}")
来获取特定用户信息。
- gRPC:
- 特点:基于HTTP/2协议,采用二进制序列化,相比JSON等文本格式,体积更小、传输速度更快,适合对性能要求高的场景。它基于Protobuf定义接口,能在不同语言间高效交互。
- 示例:定义
.proto
文件来描述服务和消息结构,如:
syntax = "proto3";
service Greeter {
rpc SayHello(HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
- 消息队列:
- 特点:解耦服务间的直接依赖,实现异步通信。提高系统的可扩展性和容错性,适合处理高并发、流量削峰等场景。
- 示例:使用Kafka作为消息队列,生产者发送消息到指定主题(topic),消费者从主题中拉取消息进行处理。如:
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");
producer.send(record);
通信安全性保障(跨网络环境)
- TLS加密:
- 技术方案:对于RESTful API和gRPC,都可以启用TLS(Transport Layer Security)加密。在服务器端配置SSL证书,客户端在发起请求时验证服务器证书的合法性。
- 实现细节:在Spring Boot中,可以通过配置
application.properties
文件启用HTTPS:
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=password
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat
对于gRPC,可在服务器端配置SslServerCredentials
:
SslContext sslContext = SslContextBuilder.forServer(new File("server.crt"), new File("server.key"))
.build();
Server server = ServerBuilder.forPort(50051)
.addService(new GreeterServiceImpl())
.useTransportSecurity(sslContext)
.build()
.start();
- 身份认证与授权:
- 技术方案:
- 身份认证:采用JSON Web Tokens(JWT)或OAuth 2.0等标准协议。JWT生成包含用户身份信息的令牌,在请求头中传递,服务器验证令牌合法性。OAuth 2.0适用于第三方授权场景。
- 授权:基于角色的访问控制(RBAC)或基于属性的访问控制(ABAC)。RBAC根据用户角色分配权限,ABAC根据用户、资源和环境等属性进行权限判断。
- 实现细节:
- JWT示例:在Spring Boot中,使用
jjwt
库生成和验证JWT:
- JWT示例:在Spring Boot中,使用
- 技术方案:
// 生成JWT
String jwt = Jwts.builder()
.setSubject("user1")
.claim("role", "admin")
.signWith(SignatureAlgorithm.HS256, "secret")
.compact();
// 验证JWT
Claims claims = Jwts.parser()
.setSigningKey("secret")
.parseClaimsJws(jwt)
.getBody();
- **RBAC示例**:在Spring Security中配置基于角色的访问权限:
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
- 网络隔离与防火墙:
- 技术方案:利用Docker网络隔离功能,如桥接网络、主机网络等,确保不同微服务在不同网络空间。同时,配置防火墙规则,限制外部对微服务端口的访问,只允许特定IP或网段的请求。
- 实现细节:在Docker Compose中,可以定义不同的网络:
networks:
my-network:
driver: bridge
services:
service1:
image: my-image1
networks:
- my-network
service2:
image: my-image2
networks:
- my-network
在云环境中,如AWS,可以通过安全组配置防火墙规则,允许特定IP访问微服务端口。