微服务之间相互调用

使用RESTful API进行微服务调用

服务A(调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Web: 用于构建Web应用和RESTful API。
    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Lombok (可选): 简化Java对象的开发。
    • Spring Cloud OpenFeign: 用于简化HTTP客户端调用。
  2. 配置文件application.properties
    配置服务器端口。

    server.port=8080
    
  3. 定义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);
    }
    
  4. 创建控制器
    这个控制器包含一个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 {
    
        @Autowired
        private ServiceBClient serviceBClient;  // 注入Feign客户端
    
        // 定义一个GET请求方法,调用服务B的API并返回结果
        @GetMapping("/service-a/data/{id}")
        public String getDataFromServiceB(@PathVariable String id) {
            return serviceBClient.getDataById(id);
        }
    }
    
  5. 启动类
    启动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(被调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Web: 用于构建Web应用和RESTful API。
    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Lombok (可选): 简化Java对象的开发。
  2. 配置文件application.properties
    配置服务器端口。

    server.port=8081
    
  3. 创建控制器
    这个控制器包含一个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;
        }
    }
    
  4. 启动类
    启动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(调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Spring Boot Starter: 提供Spring Boot核心依赖。
    • gRPC Starter: 提供gRPC支持。
  2. 生成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;
    }
    
  3. 创建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通道,连接到服务B
            ManagedChannel 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();
        }
    }
    
  4. 创建控制器
    这个控制器包含一个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 {
    
        @Autowired
        private GrpcClientService grpcClientService;  // 注入gRPC客户端服务
    
        // 定义一个GET请求方法,调用服务B的gRPC方法并返回结果
        @GetMapping("/service-a/data/{id}")
        public String getDataFromServiceB(@PathVariable String id) {
            return grpcClientService.getData(id);
        }
    }
    
  5. 启动类
    启动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(被调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Spring Boot Starter: 提供Spring Boot核心依赖。
    • gRPC Starter: 提供gRPC支持。
  2. 生成gRPC代码
    定义.proto文件并使用protoc编译生成Java代码(同上)。

  3. 实现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服务的方法
        @Override
        public 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();
        }
    }
    
  4. 启动类
    启动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

    • 高性能、低延迟。
    • 支持多种语言。
    • 适合需要高效通信的场景,尤其是需要双向流和复杂数据交换的场景。
  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值