微服务之间相互调用

2024-09-05 08:44
文章标签 服务 调用 之间 相互

本文主要是介绍微服务之间相互调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用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 {@Autowiredprivate 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通道,连接到服务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();}
    }
    
  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 {@Autowiredprivate 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服务的方法@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();}
    }
    
  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

    • 高性能、低延迟。
    • 支持多种语言。
    • 适合需要高效通信的场景,尤其是需要双向流和复杂数据交换的场景。

这篇关于微服务之间相互调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1138482

相关文章

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将