本文主要是介绍微服务之间相互调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用RESTful API进行微服务调用
服务A(调用方)
-
创建Spring Boot项目:
使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:- Spring Web: 用于构建Web应用和RESTful API。
- Spring Boot DevTools: 提供开发时的热加载功能。
- Lombok (可选): 简化Java对象的开发。
- Spring Cloud OpenFeign: 用于简化HTTP客户端调用。
-
配置文件
application.properties
:
配置服务器端口。server.port=8080
-
定义Feign客户端:
Feign是一个声明式HTTP客户端,可以简化RESTful服务的调用。这里定义了一个接口ServiceBClient
,用于调用服务B的API。import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;// 定义Feign客户端,用于调用服务B的API @FeignClient(name = "service-b", url = "http://localhost:8081") public interface ServiceBClient {// 声明一个GET请求方法,映射到服务B的API@GetMapping("/api/data/{id}")String getDataById(@PathVariable("id") String id); }
-
创建控制器:
这个控制器包含一个RESTful端点,用于接收来自客户端的请求,并通过ServiceBClient
调用服务B的API。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController;@RestController public class ServiceAController {@Autowiredprivate ServiceBClient serviceBClient; // 注入Feign客户端// 定义一个GET请求方法,调用服务B的API并返回结果@GetMapping("/service-a/data/{id}")public String getDataFromServiceB(@PathVariable String id) {return serviceBClient.getDataById(id);} }
-
启动类:
启动Spring Boot应用并启用Feign客户端。import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication @EnableFeignClients // 启用Feign客户端 public class ServiceAApplication {public static void main(String[] args) {SpringApplication.run(ServiceAApplication.class, args); // 启动应用} }
服务B(被调用方)
-
创建Spring Boot项目:
使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:- Spring Web: 用于构建Web应用和RESTful API。
- Spring Boot DevTools: 提供开发时的热加载功能。
- Lombok (可选): 简化Java对象的开发。
-
配置文件
application.properties
:
配置服务器端口。server.port=8081
-
创建控制器:
这个控制器包含一个RESTful端点,用于接收来自服务A的请求,并返回相应的数据。import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController;@RestController public class ServiceBController {// 定义一个GET请求方法,返回ID对应的数据@GetMapping("/api/data/{id}")public String getData(@PathVariable String id) {return "Data from Service B with ID: " + id;} }
-
启动类:
启动Spring Boot应用。import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class ServiceBApplication {public static void main(String[] args) {SpringApplication.run(ServiceBApplication.class, args); // 启动应用} }
使用gRPC进行微服务调用
服务A(调用方)
-
创建Spring Boot项目:
使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:- Spring Boot DevTools: 提供开发时的热加载功能。
- Spring Boot Starter: 提供Spring Boot核心依赖。
- gRPC Starter: 提供gRPC支持。
-
生成gRPC代码:
定义.proto文件并使用protoc编译生成Java代码。syntax = "proto3";package com.example.grpc;// 定义gRPC服务 service DataService {// 定义一个RPC方法rpc GetData (DataRequest) returns (DataResponse); }// 定义请求消息 message DataRequest {string id = 1; }// 定义响应消息 message DataResponse {string data = 1; }
-
创建gRPC客户端:
这个服务类包含一个gRPC客户端,用于连接到服务B并调用其方法。import com.example.grpc.DataServiceGrpc; import com.example.grpc.DataRequest; import com.example.grpc.DataResponse; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import org.springframework.stereotype.Service;@Service public class GrpcClientService {private final DataServiceGrpc.DataServiceBlockingStub stub;public GrpcClientService() {// 创建一个gRPC通道,连接到服务BManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090).usePlaintext().build();// 创建一个阻塞式的gRPC客户端stub = DataServiceGrpc.newBlockingStub(channel);}// 调用服务B的gRPC方法public String getData(String id) {DataRequest request = DataRequest.newBuilder().setId(id).build();DataResponse response = stub.getData(request);return response.getData();} }
-
创建控制器:
这个控制器包含一个RESTful端点,用于接收来自客户端的请求,并通过GrpcClientService
调用服务B的gRPC服务。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController;@RestController public class ServiceAController {@Autowiredprivate GrpcClientService grpcClientService; // 注入gRPC客户端服务// 定义一个GET请求方法,调用服务B的gRPC方法并返回结果@GetMapping("/service-a/data/{id}")public String getDataFromServiceB(@PathVariable String id) {return grpcClientService.getData(id);} }
-
启动类:
启动Spring Boot应用。import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class ServiceAApplication {public static void main(String[] args) {SpringApplication.run(ServiceAApplication.class, args); // 启动应用} }
服务B(被调用方)
-
创建Spring Boot项目:
使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:- Spring Boot DevTools: 提供开发时的热加载功能。
- Spring Boot Starter: 提供Spring Boot核心依赖。
- gRPC Starter: 提供gRPC支持。
-
生成gRPC代码:
定义.proto文件并使用protoc编译生成Java代码(同上)。 -
实现gRPC服务:
这个服务类实现了gRPC服务,处理来自服务A的请求并返回响应数据。import com.example.grpc.DataServiceGrpc; import com.example.grpc.DataRequest; import com.example.grpc.DataResponse; import io.grpc.stub.StreamObserver; import net.devh.boot.grpc.server.service.GrpcService;@GrpcService public class GrpcDataService extends DataServiceGrpc.DataServiceImplBase {// 实现gRPC服务的方法@Overridepublic void getData(DataRequest request, StreamObserver<DataResponse> responseObserver) {String id = request.getId();DataResponse response = DataResponse.newBuilder().setData("Data from Service B with ID: " + id).build();// 返回响应数据responseObserver.onNext(response);responseObserver.onCompleted();} }
-
启动类:
启动Spring Boot应用。import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class ServiceBApplication {public static void main(String[] args) {SpringApplication.run(ServiceBApplication.class, args); // 启动应用} }
优点和适用场景:
-
RESTful API:
- 易于理解和使用。
- 广泛支持各种客户端和工具。
- 适合简单的请求/响应模式。
-
gRPC:
- 高性能、低延迟。
- 支持多种语言。
- 适合需要高效通信的场景,尤其是需要双向流和复杂数据交换的场景。
这篇关于微服务之间相互调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!