You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java gRPC Server设置应用上下文及路径修改示例代码求助

Setting a Base Path (Application Context) for Java gRPC Server

To adjust your gRPC server to serve requests under /example-server instead of the root path, the approach depends on whether you're using a vanilla gRPC Netty server or integrating with Spring Boot. Here are both solutions tailored to your HTTPS setup:

1. Vanilla gRPC Netty Server

If you're using the standard Netty-based gRPC server, you can add a custom channel handler to rewrite incoming HTTP/2 request paths by stripping the /example-server prefix before they reach the gRPC service handlers.

Sample Code:

import io.grpc.Server;
import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
import io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext;
import io.grpc.netty.shaded.io.netty.channel.ChannelInboundHandlerAdapter;
import io.grpc.netty.shaded.io.netty.handler.codec.http.HttpRequest;
import io.grpc.netty.shaded.io.netty.util.ReferenceCountUtil;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;

import java.io.File;
import java.io.IOException;

public class ExampleGrpcServer {

    public static void main(String[] args) throws IOException, InterruptedException {
        int port = 443;
        String basePath = "/example-server";

        // SSL/TLS configuration for HTTPS
        SslContext sslContext = SslContextBuilder.forServer(
                new File("path/to/server.crt"),
                new File("path/to/server.key")
        ).build();

        // Custom handler to rewrite request paths
        ChannelInboundHandlerAdapter pathRewriteHandler = new ChannelInboundHandlerAdapter() {
            @Override
            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                if (msg instanceof HttpRequest) {
                    HttpRequest request = (HttpRequest) msg;
                    String uri = request.uri();

                    // Strip the base path prefix if present
                    if (uri.startsWith(basePath)) {
                        String newUri = uri.substring(basePath.length());
                        // Handle case where prefix is the entire URI
                        if (newUri.isEmpty()) {
                            newUri = "/";
                        }
                        HttpRequest modifiedRequest = request.setUri(newUri);
                        ReferenceCountUtil.release(msg);
                        msg = modifiedRequest;
                    }
                }
                super.channelRead(ctx, msg);
            }
        };

        // Build and start the server
        Server server = NettyServerBuilder.forPort(port)
                .sslContext(sslContext)
                // Add path rewrite handler before gRPC's internal handlers
                .prependChannelHandler("path-rewrite", pathRewriteHandler)
                // Register your gRPC service implementation
                .addService(new YourGrpcServiceImpl())
                .build();

        server.start();
        System.out.println("gRPC server started at https://localhost:" + port + basePath);
        server.awaitTermination();
    }
}

2. Spring Boot with gRPC Starter

If you're using Spring Boot with the net.devh:grpc-spring-boot-starter dependency, setting a base path is straightforward using configuration properties—no custom code needed.

Step 1: Add Configuration

In your application.yml:

grpc:
  server:
    port: 443
    ssl:
      enabled: true
      certificate: classpath:server.crt  # Path to your cert file
      private-key: classpath:server.key  # Path to your private key
    service-path: /example-server  # Your desired base path

Or in application.properties:

grpc.server.port=443
grpc.server.ssl.enabled=true
grpc.server.ssl.certificate=classpath:server.crt
grpc.server.ssl.private-key=classpath:server.key
grpc.server.service-path=/example-server

Step 2: Register Your gRPC Service

Just annotate your service implementation with @GrpcService as usual:

import net.devh.boot.grpc.server.service.GrpcService;

@GrpcService
public class YourGrpcServiceImpl extends YourServiceGrpc.YourServiceImplBase {

    // Implement your gRPC methods here
    @Override
    public void yourMethod(YourRequest request, StreamObserver<YourResponse> responseObserver) {
        // Your business logic
        responseObserver.onNext(YourResponse.getDefaultInstance());
        responseObserver.onCompleted();
    }
}

Key Notes

  • HTTPS Setup: Both examples include SSL/TLS configuration since you're using https://. Ensure your server certificates are valid and correctly referenced.
  • Client Compatibility: When connecting to the server, your gRPC client should target paths like https://host:port/example-server/your.package.YourService/YourMethod. Most gRPC clients will handle this automatically if you specify the correct server address with the base path, or the server-side rewrite will adjust requests sent to the prefixed path.

内容的提问来源于stack exchange,提问作者Srumith Uplanchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:41:37