Spring Boot starter module for gRPC framework.

Overview

gRPC Spring Boot Starter

Build master branch Maven Central with version prefix filter MIT License Crowdin

Client-Javadoc Server-Javadoc Common-Javadoc

README: English | 中文

Documentation: English | 中文

Features

  • Automatically configures and runs the gRPC server with your @GrpcService implementations

  • Automatically creates and manages your grpc channels and stubs with @GrpcClient

  • Supports other grpc-java flavors (e.g. Reactive gRPC (RxJava), grpc-kotlin, ...)

    • Server-side: Should work for all grpc-java flavors (io.grpc.BindableService based)
    • Client-side: Requires custom StubFactorys
      Currently build-in support:
      • grpc-java
      • (Please report missing ones, so we can add support for them)
  • Supports Spring-Security

  • Supports Spring Cloud

    • Server-side: Adds grpc-port information to the service registration details
      Currently natively supported:
    • Client-side: Reads the service's target addresses from spring's DiscoveryClient (all flavors)
  • Supports Spring Sleuth as distributed tracing solution
    (If brave-instrumentation-grpc is present)

  • Supports global and custom gRPC server/client interceptors

  • Automatic metric support (micrometer/actuator based)

  • Also works with (non-shaded) grpc-netty

Versions

2.x.x.RELEASE supports Spring Boot 2.1.x/2.2.x & Spring Cloud Greenwich/Hoxton.

The latest version: 2.11.0.RELEASE

(Use 2.4.0.RELEASE for Spring Boot 2.0.x & Spring Cloud Finchley).

1.x.x.RELEASE support Spring Boot 1 & Spring Cloud Edgware, Dalston, Camden.

The latest version: 1.4.2.RELEASE

Note: This project can also be used without Spring-Boot, however that requires some manual bean configuration.

Usage

gRPC Server + Client

To add a dependency using Maven, use the following:

<dependency>
  <groupId>net.devhgroupId>
  <artifactId>grpc-spring-boot-starterartifactId>
  <version>2.11.0.RELEASEversion>
dependency>

To add a dependency using Gradle:

dependencies {
  implementation 'net.devh:grpc-spring-boot-starter:2.11.0.RELEASE'
}

gRPC Server

To add a dependency using Maven, use the following:

<dependency>
  <groupId>net.devhgroupId>
  <artifactId>grpc-server-spring-boot-starterartifactId>
  <version>2.11.0.RELEASEversion>
dependency>

To add a dependency using Gradle:

dependencies {
  implementation 'net.devh:grpc-server-spring-boot-starter:2.11.0.RELEASE'
}

Annotate your server interface implementation(s) with @GrpcService

@GrpcService
public class GrpcServerService extends GreeterGrpc.GreeterImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
        HelloReply reply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }

}

By default, the grpc server will listen to port 9090. These and other settings can be changed via Spring's property mechanism. The server uses the grpc.server. prefix.

Refer to our documentation for more details.

gRPC Client

To add a dependency using Maven, use the following:

<dependency>
  <groupId>net.devhgroupId>
  <artifactId>grpc-client-spring-boot-starterartifactId>
  <version>2.11.0.RELEASEversion>
dependency>

To add a dependency using Gradle:

dependencies {
  compile 'net.devh:grpc-client-spring-boot-starter:2.11.0.RELEASE'
}

Annotate a field of your grpc client stub with @GrpcClient(serverName)

  • Do not use in conjunction with @Autowired or @Inject

    @GrpcClient("gRPC server name")
    private GreeterGrpc.GreeterBlockingStub greeterStub;

Note: You can use the same grpc server name for multiple channels and also different stubs (even with different interceptors).

Then you can send queries to your server just like this:

HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName(name).build());

It is possible to configure the target address for each client individually. However in some cases, you can just rely on the default configuration. You can customize the default url mapping via NameResolver.Factory beans. If you don't configure that bean, then the default uri will be guessed using the default scheme and the name (e.g.: dns:/):

These and other settings can be changed via Spring's property mechanism. The clients use the grpc.client.(serverName). prefix.

Refer to our documentation for more details.

Running with (non-shaded) grpc-netty

This library supports both grpc-netty and grpc-netty-shaded. The later one might prevent conflicts with incompatible grpc-versions or conflicts between libraries that require different versions of netty.

Note: If the shaded netty is present on the classpath, then this library will always favor it over the non-shaded grpc-netty one.

You can use it with Maven like this:

<dependency>
    <groupId>io.grpcgroupId>
    <artifactId>grpc-nettyartifactId>
    <version>${grpcVersion}version>
dependency>


<dependency>
    <groupId>net.devhgroupId>
    <artifactId>grpc-spring-boot-starterartifactId>
    <version>...version>
    <exclusions>
        <exclusion>
            <groupId>io.grpcgroupId>
            <artifactId>grpc-netty-shadedartifactId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>net.devhgroupId>
    <artifactId>grpc-server-spring-boot-starterartifactId>
    <version>...version>
    <exclusions>
        <exclusion>
            <groupId>io.grpcgroupId>
            <artifactId>grpc-netty-shadedartifactId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>net.devhgroupId>
    <artifactId>grpc-client-spring-boot-starterartifactId>
    <version>...version>
    <exclusions>
        <exclusion>
            <groupId>io.grpcgroupId>
            <artifactId>grpc-netty-shadedartifactId>
        exclusion>
    exclusions>
dependency>

and like this when using Gradle:

implementation "io.grpc:grpc-netty:${grpcVersion}"

implementation 'net.devh:grpc-spring-boot-starter:...' exclude group: 'io.grpc', module: 'grpc-netty-shaded' // For both
implementation 'net.devh:grpc-client-spring-boot-starter:...' exclude group: 'io.grpc', module: 'grpc-netty-shaded' // For the client (only)
implementation 'net.devh:grpc-server-spring-boot-starter:...' exclude group: 'io.grpc', module: 'grpc-netty-shaded' // For the server (only)

Example-Projects

Read more about our example projects here.

Troubleshooting

Refer to our documentation for help.

Contributing

Contributions are always welcomed! Please see CONTRIBUTING.md for detailed guidelines.

Comments
  • Extend documentation

    Extend documentation

    I plan to extend the documentation for this project and split it into separate pages.

    Now, the question is which feature should we use for that purpose? The GitHub Pages using the /docs folder or the github wiki feature?

    Example-GitHub Pages: https://st-ddt.github.io/grpc-spring-boot-starter/ ~~I don't have an example wiki yet:~~ ~~https://github.com/ST-DDT/grpc-spring-boot-starter/wiki~~


    At the moment, I have the following topics in mind:

    • [x] Index
    • Server
      • [x] Getting Started
      • [x] Configuration
      • [x] Contextual Data / Scoped Beans
      • [x] Testing the Service
      • [x] Security
    • Client
      • [x] Getting Started
      • [x] Configuration
      • [x] Security
    • [x] Spring Boot Actuator / Metrics Support
    • [x] Brave-Tracing / Spring Cloud Sleuth Support
    • [ ] Others setups
    • [x] Trouble-Shooting
    • [x] Example Projects
    • [x] Version Overview
    • [x] Benchmarking
    • [x] Contributing

    Anything missing? Or should I change some of the topics?

    documentation 
    opened by ST-DDT 23
  • Fix #311. DiscoveryClientNameResolver leak and performance issue.

    Fix #311. DiscoveryClientNameResolver leak and performance issue.

    1. Move the work of updating service instance list to DiscoveryClientResolverFactory to reduce the workload of Eureka.
    2. set listener of DiscoveryClientNameResolver to null to avoid leak of Channel.
    3. Add method of register/unregister listener to DiscoveryClientResolverFactory

    @ST-DDT

    Fixes #311

    bug enhancement 
    opened by wangzw 21
  • grpc exception handling

    grpc exception handling

    Work in progress - Feedback appreciated

    I stumbled upon a cluttered Error Handling with gRPC and i was used to the spring way how to handle Exceptions for ReST-Calls. So i adopted a little bit from Springs @ControllerAdvice and created something for gRPC @GrpcServiceAdvice.

    I'll work an in-depth example into the docs.

    If you guys have any suggestions or improvements, please let me know.


    Workflow

    • Service is annotated with @GrpcService
    • Create Class with annotation @GrpcServiceAdvice
    • Annotate Methods with @GrpcExceptionHandler
      • add wanted Exception class inside annotation OR
      • give the annotated Method wanted Exception as parameter
      • or both of the above
    • annotated Method has to return Throwable, since gRPC needs to call for a request StreamObserver<?>.onError(Throwable t)

    TODO

    • [x] closing connection for grpc stream (asyn calls) ✔️
      • exception is being handled, but the stream is not closed
    • [x] add unit tests ✔️
    • [x] add java docs ✔️
    • [x] add project docs (.md files) ✔️
    • [x] waiting for #471 merge ✔️
    • [x] review 🏁 in progress

    EDIT: updated todos

    enhancement documentation 
    opened by anjeyy 19
  • TLS not working with openJDK8

    TLS not working with openJDK8

    Not sure, if this is the right forum, but i failed to use TLS.

    When connecting, i get

    Caused by: javax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
    	at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:629) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.internal.tcnative.SSL.readFromSSL(Native Method) ~[netty-tcnative-boringssl-static-2.0.20.Final.jar:2.0.20.Final]
    	at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.readPlaintextData(ReferenceCountedOpenSslEngine.java:488) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1036) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1144) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.SslHandler$SslEngineType$1.unwrap(SslHandler.java:211) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1297) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1199) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1243) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) ~[netty-codec-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) ~[netty-codec-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) ~[netty-codec-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_181]
    Caused by: java.lang.IllegalArgumentException: TLSv1.3
    	at sun.security.ssl.ProtocolVersion.valueOf(ProtocolVersion.java:187) ~[na:1.8.0_181]
    	at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:258) ~[na:1.8.0_181]
    	at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) ~[na:1.8.0_181]
    	at io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback.verify(ReferenceCountedOpenSslClientContext.java:237) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:625) ~[netty-handler-4.1.29.Final.jar:4.1.29.Final]
    	... 26 common frames omitted
    

    Looking at ProtocolVersion (in openJDK8) indeed reveals:

        private static ProtocolVersion valueOf(int var0) {
            if (var0 == SSL30.v) {
                return SSL30;
            } else if (var0 == TLS10.v) {
                return TLS10;
            } else if (var0 == TLS11.v) {
                return TLS11;
            } else if (var0 == TLS12.v) {
                return TLS12;
            } else if (var0 == SSL20Hello.v) {
                return SSL20Hello;
            } else {
                int var1 = var0 >>> 8 & 255;
                int var2 = var0 & 255;
                return new ProtocolVersion(var0, "Unknown-" + var1 + "." + var2);
            }
        }
    

    Is there a way to use TLS1.2?

    Setup:

    Server and Client run on openjdk8. I am using boringssl-static on both sides

       <dependency>
          <groupId>io.netty</groupId>
          <artifactId>netty-tcnative-boringssl-static</artifactId>
          <version>2.0.20.Final</version>
        </dependency>
    

    Client properties:

    grpc.client.x.port=9443
    grpc.client.x.host=localhost
    grpc.client.x.security.trustCertCollectionPath=src/etc/certificates/trusted-servers/localhost.crt
    grpc.client.x.security.authorityOverride=localhost
    

    Server properties:

    grpc.server.port=9443
    grpc.server.security.enabled=true
    grpc.server.security.certificateChainPath=src/etc/certificates/localhost.crt
    grpc.server.security.privateKeyPath=src/etc/certificates/localhost.key
    
    opened by uweschaefer 19
  • grpc-spring-boot-starter Tracing 的 Interceptor 问题

    grpc-spring-boot-starter Tracing 的 Interceptor 问题

    需要实现 tracing 调用链路,但是我们没有使用 springcloud

    在使用的时候默认貌似需要自动注入 sleuth 的 TraceAutoConfiguration 类,导致报错找不到类

    springboot 版本:2.4.1 grpc-spring-boot-starter 版本:2.10.1.RELEASE

    question feedback required incompatibility 
    opened by qianxunclub 18
  • INTERNAL: http2 exception

    INTERNAL: http2 exception

    hello master:

    Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL: http2 exception
    	at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:221)
    	at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:202)
    	at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:131)
    	at com.paic.gsd.cmd.pdns.grpc.tasks.TasksGrpc$TasksBlockingStub.sendLDNS(TasksGrpc.java:594)
    	at com.paic.gsd.test.main(test.java:25)
    Caused by: io.netty.handler.codec.http2.Http2Exception: First received frame was not SETTINGS. Hex dump for first 5 bytes: 485454502f
    	at io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:85)
    	at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.verifyFirstFrameIsSettings(Http2ConnectionHandler.java:350)
    	at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:251)
    	at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:450)
    	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489)
    	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428)
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1414)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:945)
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:146)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
    	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:748)
    
    invalid question 
    opened by 991697456 15
  • how to set custom executor to the gRPC Service

    how to set custom executor to the gRPC Service

    when i register a gRPC service using gRPC libraries , i can customize the executor behavior to get maximum performance out of the serice.

    Similarly using this artifact how i can customize executor for any gRPC service

    question feedback required 
    opened by banandh 14
  • Extra annotation for gRPC clients/stubs integration with spring context

    Extra annotation for gRPC clients/stubs integration with spring context

    Context

    Closes #463

    There is a rather inconvenient problem described in https://github.com/yidongnan/grpc-spring-boot-starter/issues/463 @GrpcClient is not a @Bean, so we are encouraged to wrap it in a standard bean creation for quality of life.

    @Configuration
    public class MyCustomGrpcBeanConfigh {
    
        @GrpcClient("client")
        private MyStub myStub;
    
        @Bean
        MyExternalBean myExternalBean() {
            return new MyExternalBean(myStub);
        }
    
    }
    
    @Configuration
    public class MyAnotherCustomGrpcBeanConfig {
    
        @Bean
        MyAnotherExternalBean myAnotherExternalBean(@Autiwired MyExternalBean myExternalBean) {
            return new MyAnotherExternalBean (myExternalBean.getStub());
        }
    
    }
    

    TO BE

    @Configuration
    public class MyCustomGrpcBeanConfigh {
    
        @GrpcClient("client")
        private MyStub myStub;
    
    }
    
    @Configuration
    public class MyAnotherCustomGrpcBeanConfig {
    
        @Bean
        MyAnotherExternalBean myAnotherExternalBean(@Autiwired MyStub myStub) {
            return new MyAnotherExternalBean (myStub);
        }
    
    }
    

    TO DO

    • [x] register client as bean after injection section into BeanPostProcessor
    • [x] invoke autowire manually via AutowireCapableBeanFactory
    • [x] make sure the bean is created in context, @Autowired and @Qualifier are available for method and field injection
    • [x] proof it with unit test
    enhancement 
    opened by a-simeshin 13
  • How to define a client interceptor ?

    How to define a client interceptor ?

    I have a spring-boot app and I'm trying to define a client interceptor for my grpc service, so that I can set some custom headers in the response (which will be transcoded to html)

    My interceptor definition looks like this:

    import io.grpc.CallOptions;
    import io.grpc.Channel;
    import io.grpc.ClientCall;
    import io.grpc.ClientInterceptor;
    import io.grpc.ForwardingClientCall.SimpleForwardingClientCall;
    import io.grpc.ForwardingClientCallListener.SimpleForwardingClientCallListener;
    import io.grpc.Metadata;
    import io.grpc.MethodDescriptor;
    import net.devh.boot.grpc.client.interceptor.GrpcGlobalClientInterceptor;
    
    @GrpcGlobalClientInterceptor
    public class HeaderClientInterceptor implements ClientInterceptor {
    
      static final Metadata.Key<String> CUSTOM_HEADER_KEY =
          Metadata.Key.of("custom_client_header_key", Metadata.ASCII_STRING_MARSHALLER);
    
      @Override
      public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,
          CallOptions callOptions, Channel next) {
        System.out.println("====log====================");
        return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
            @Override
            public void sendMessage(ReqT message) {
                System.out.println("====log send====================");
                super.sendMessage(message);
            }
            @Override
            public void start(Listener<RespT> responseListener, Metadata headers) {
                headers.put(CUSTOM_HEADER_KEY, "customRequestValue");
                super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) {
                    @Override
                    public void onHeaders(Metadata headers) {
                        System.out.println("====head===================="+headers);
                        super.onHeaders(headers);
                    }
                }, headers);
            }
        };
      }
    }
    

    No matter what I've tried, the response doesn't want o go through that code. Just note that I also have a ServerInterceptor define in my code, and that logic works fine.

    My .proto api definition looks like:

    rpc DownloadBuild(DownloadBuildRequest) returns (stream google.api.HttpBody) {
        option (google.api.http) = {
          get : "/v4/projects/{projectId}/types/{buildType}/builds/{buildVersion}/.download"
        };
        option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = {
          description: "Download build.";
          summary: "Download build.";
          tags: "Builds";
          responses: {
            key: "200"
            value: {
              description: "Download build";
            }
          }
          responses: {
            key: "401"
            value: {
              description: "Request could not be authorized";
            }
          }
          responses: {
            key: "404"
            value: {
              description: "Build not found";
            }
          }
          responses: {
            key: "500"
            value: {
              description: "Internal server error";
            }
          }
        };
      }
    

    while my grpc implementation looks like this:

    ...
    @GrpcService
    public class GrpcAPIService extends MixAPIGrpc.MixAPIImplBase {
    ...
     @Override
        public void downloadBuild(DownloadBuildRequest request, StreamObserver<com.google.api.HttpBody> responseObserver) {
            handleDownloadGrpcCall("downloadBuild", mwProxy::downloadBuild, request, responseObserver);
        }
    ...
     private <T, R> void handleDownloadGrpcCall(String grpcMethodName, Function<T, byte[]> serviceMethod, T request,
                StreamObserver<com.google.api.HttpBody> streamObserver) {
            log.debug("{}: >>>, request:[{}]", grpcMethodName, request);
            try {
                Instant start = Instant.now();
                byte[] bytes = serviceMethod.apply(request);
                BufferedInputStream stream = new BufferedInputStream(new ByteArrayInputStream(bytes));
    
                int bufferSize = 1 * 1024;// 1KB
                byte[] buffer = new byte[bufferSize];
                int length;
                boolean addExtension = true;
                while ((length = stream.read(buffer, 0, bufferSize)) != -1) {
                    streamObserver.onNext(com.google.api.HttpBody.newBuilder()
                            .setData(ByteString.copyFrom(buffer, 0, length))
                            .setContentType("application/octet-stream")
                            .build());
                }
                stream.close();
                streamObserver.onCompleted();
                Instant end = Instant.now();
                timingService.logMethodExecution(grpcMethodName, start, end, request);
            } catch (Exception e) {
                handleException(e, streamObserver, request, grpcMethodName);
            }
            log.debug("{}: <<<<", grpcMethodName);
        }
    ...
    

    Any idea what could be wrong ?

    question 
    opened by ghevge 13
  • Gradle file example from Getting Started Guide does not work

    Gradle file example from Getting Started Guide does not work

    The context

    The guide gives an example of a gradle build file here: https://yidongnan.github.io/grpc-spring-boot-starter/en/server/getting-started.html

    The question

    However the resolution of that file files for the first dependency tasks

    Stacktraces and logs

    FAILURE: Build completed with 2 failures.
    
    1: Task failed with an exception.
    -----------
    * Where:
    Build file '/home/xetra11/Development/projects/user-service/grpc-lib/build.gradle' line: 4
    
    * What went wrong:
    A problem occurred evaluating project ':grpc-lib'.
    > Could not find method implementation() for arguments [io.grpc:grpc-protobuf:1.35.0] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    ==============================================================================
    
    2: Task failed with an exception.
    -----------
    * What went wrong:
    A problem occurred configuring project ':grpc-lib'.
    > The com.google.protobuf plugin could not be applied during project evaluation. The Java plugin or one of the Android plugins must be applied to the project first.
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    ==============================================================================
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 94ms
    
    

    The application's environment

    The build file:

    apply plugin: 'com.google.protobuf'
    
    dependencies {
        compile "io.grpc:grpc-protobuf:1.35.0"
        compile "io.grpc:grpc-stub:1.35.0"
    }
    
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.14'
        }
    }
    
    protobuf {
        protoc {
            artifact = "com.google.protobuf:protoc:3.14.0"
        }
        generatedFilesBaseDir = "$projectDir/src/generated"
        clean {
            delete generatedFilesBaseDir
        }
        plugins {
            grpc {
                artifact = "io.grpc:protoc-gen-grpc-java"
            }
        }
        generateProtoTasks {
            all()*.plugins {
                grpc {}
            }
        }
    }
    
    buildscript {
        dependencies {
            classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.14"
        }
    }
    
    question documentation 
    opened by xetra11 13
  • I got the following error message when I start the cloud-client.Could you please tell me what I did wrong.

    I got the following error message when I start the cloud-client.Could you please tell me what I did wrong.

    The error message

    2020-12-21 19:19:18.795  INFO 12476 --- [           main] n.d.b.g.c.a.GrpcClientAutoConfiguration  : Detected grpc-netty-shaded: Creating ShadedNettyChannelFactory + InProcessChannelFactory
    2020-12-21 19:19:18.835  WARN 12476 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testService' defined in file [E:\projects-reborn\automated-testing\client\target\classes\com\flowpp\automated\client\controller\TestService.class]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder.defaultLoadBalancingPolicy(Ljava/lang/String;)Lio/grpc/internal/AbstractManagedChannelImplBuilder;
    2020-12-21 19:19:18.836  INFO 12476 --- [           main] n.d.b.g.c.n.NameResolverRegistration     : DiscoveryClientResolverFactory [scheme=discovery, discoveryClient=org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClient@2ed71727] was removed from the NameResolverRegistry
    2020-12-21 19:19:18.846  INFO 12476 --- [           main] ConditionEvaluationReportLoggingListener : 
    
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2020-12-21 19:19:18.850 ERROR 12476 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    An attempt was made to call a method that does not exist. The attempt was made from the following location:
    
        net.devh.boot.grpc.client.channelfactory.ShadedNettyChannelFactory.newChannelBuilder(ShadedNettyChannelFactory.java:73)
    
    The following method did not exist:
    
        io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder.defaultLoadBalancingPolicy(Ljava/lang/String;)Lio/grpc/internal/AbstractManagedChannelImplBuilder;
    
    The method's class, io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder, is available from the following locations:
    
        jar:file:/E:/runtime-env/apache-maven-3.6.3/repository/io/grpc/grpc-netty-shaded/1.33.0/grpc-netty-shaded-1.33.0.jar!/io/grpc/netty/shaded/io/grpc/netty/NettyChannelBuilder.class
    
    It was loaded from the following location:
    
        file:/E:/runtime-env/apache-maven-3.6.3/repository/io/grpc/grpc-netty-shaded/1.33.0/grpc-netty-shaded-1.33.0.jar
    
    
    Action:
    
    Correct the classpath of your application so that it contains a single, compatible version of io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder
    

    My config file

    grpc:
      client:
        my-server:
          enableKeepAlive: true
          keepAliveWithoutCalls: true
          negotiationType: plaintext
    
    eureka:
      instance:
        preferIpAddress: true
        securePort: ${server.port}
        securePortEnabled: true
        nonSecurePortEnabled: false
      client:
        fetch-registry: true
        register-with-eureka: true
        prefer-same-zone-eureka: true
        serviceUrl:
          defaultZone: https://localhost:xxxx/eureka/
    

    Please help me,thank you.

    question feedback required 
    opened by NeptuneNeptune 13
  • Changing server address at runtime based on user input

    Changing server address at runtime based on user input

    The context

    I develop an CLI client that needs to change the target server at runtime based on a user input.

    The question

    I implemented based on #519 a custom NameResolverProvider that is supposed to target only one server based on user input and did not specify any server in my application.properties:

    public class FixedStaticNameResolverProvider extends NameResolverProvider {
      private static final String SCHEME = "static";
      private static String DEFAULT_HOST;
      private final StaticNameResolverProvider provider = new StaticNameResolverProvider();
    
      public FixedStaticNameResolverProvider(String defaultHost) {
        this.DEFAULT_HOST = "static://" + defaultHost + ":6565";
      }
    
      @Override
      public NameResolver newNameResolver(URI targetUri, Args args) {
        try {
          System.out.println("targetUri: " + targetUri);
          System.out.println("args: " + args);
    
          NameResolver dnsNameResolver = provider.newNameResolver(new URI(DEFAULT_HOST), args);
          return dnsNameResolver;
        } catch (URISyntaxException e) {
          log.error("NameResolver creation failed", e);
          return null;
        }
      }
    
      @Override
      protected boolean isAvailable() {
        return true;
      }
    
      @Override
      protected int priority() {
        return 10; // higher than everything else
      }
    
      @Override
      public String getDefaultScheme() {
        return SCHEME;
      }
    }
    

    Here StaticNameResolverProvider is StaticNameResolverProvider.

    Then I create and register it based on https://yidongnan.github.io/grpc-spring-boot-starter/en/client/configuration.html#custom-nameresolverprovider as a bean with my application context, where grpcServerAddress is my user input (for my test case localhost):

    appContext.registerBean("tmpServer", NameResolverProvider.class, () -> new FixedStaticNameResolverProvider(grpcServerAddress));
    

    I then make an gRPC call. It does never execute my prints and therefore never invokes newNameResolver. Instead it throws this exception:

    io.grpc.StatusRuntimeException: UNAVAILABLE: Unable to resolve host grpc-server
    

    The same happens if I follow the documentation of grpc-java and register my NameResolverProvider like in the code below and execute a gRPC call.

    NameResolverProvider nameResolverProvider = new FixedStaticNameResolverProvider(grpcServerAddress);
    NameResolverRegistry.getDefaultRegistry().register(nameResolverProvider);
    

    My question is if I am simply overlooking something or if I have to achieve this functionality by hot reloading my spring application properties and then refresh my application context? I have also seen #753 and #793, is this the way and I have to create a new channel for every request, since the Discovery used in #793 seems not to be the right solution for my problem?

    The application's environment

    Which versions do you use?

    • Spring (boot): 2.6.13
    • grpc-java: 1.51.0
    • grpc-spring-boot-starter: 2.14.0.RELEASE
    • java: 18 64bit

    Additional information

    • Did it ever work before?

    The CLI client works fine if a server address is specified by the application.properties file. Even if the code above is included, it still targets the server stated in the application.properties file and everything works, but also in this case my prints in FixedStaticNameResolverProvider are never executed.

    Any input or help is highly appreciated!

    question feedback required 
    opened by Philipp-p 2
  • Update plugin org.jetbrains.kotlin.jvm to v1.8.0

    Update plugin org.jetbrains.kotlin.jvm to v1.8.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.jetbrains.kotlin.jvm | 1.7.22 -> 1.8.0 | age | adoption | passing | confidence |


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 0
  • Update dependency org.jetbrains.kotlin:kotlin-bom to v1.8.0

    Update dependency org.jetbrains.kotlin:kotlin-bom to v1.8.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.jetbrains.kotlin:kotlin-bom (source) | 1.7.22 -> 1.8.0 | age | adoption | passing | confidence |


    Release Notes

    JetBrains/kotlin

    v1.8.0

    Analysis API
    • KT-50255 Analysis API: Implement standalone mode for the Analysis API
    Analysis API. FIR
    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias
    Android
    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder
    Backend. Native. Debug
    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"
    Compiler
    New Features
    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage
    Performance Improvements
    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering
    Fixes
    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend
    • KT-55065 Kotlin Gradle DSL: Reflection cannot find class data for lambda, produced by JVM IR backend
    • KT-53270 K1: implement synthetic Enum.entries property
    • KT-52823 Cannot access class Thread.State after upgrading to 1.7 from 1.6.1 using -Xjdk-release=1.8
    • KT-55108 IR interpreter: Error occurred while optimizing an expression: VARARG
    • KT-53547 Missing fun IrBuilderWithScope.irFunctionReference
    • KT-54884 "StackOverflowError: null" caused by Enum constant name in constructor of the same Enum constant
    • KT-47475 "IncompatibleClassChangeError: disagree on InnerClasses attribute": cross-module inlined WhenMappings has mismatched InnerClasses
    • KT-55013 State checker use-after-free with XCode 14.1
    • KT-54802 "VerifyError: Bad type on operand stack" for inline functions on arrays
    • KT-54707 "VerifyError: Bad type on operand stack" in inline call chain on a nullable array value
    • KT-48678 Coroutine debugger: disable "was optimised out" compiler feature
    • KT-54745 Restore KtToken constructors without tokenId parameter to preserve back compatibility
    • KT-54650 Binary incompatible ABI change in Kotlin 1.7.20
    • KT-52786 Frontend / K2: IndexOutOfBoundsException when opting in to K2
    • KT-54004 Builder type inference does not work correctly with variable assignment and breaks run-time
    • KT-54581 JVM: "VerifyError: Bad type on operand stack" with generic inline function and when inside try-catch block
    • KT-53794 IAE "Unknown visibility: protected/protected and package/" on callable reference to protected member of Java superclass
    • KT-54600 NPE on passing nullable Kotlin lambda as Java's generic SAM interface with super type bound
    • KT-54463 Delegating to a field with a platform type causes java.lang.NoSuchFieldError: value$delegate
    • KT-54509 Ir Interpreter: unable to evaluate string concatenation with "this" as argument
    • KT-54615 JVM: Internal error in file lowering: java.lang.AssertionError: Error occurred while optimizing an expression
    • KT-53146 JVM IR: unnecessary checkcast of null leads to NoClassDefFoundError if the type isn't available at runtime
    • KT-53712 Add mode to prevent generating JVM 1.8+ annotation targets (TYPE_USE, TYPE_PARAMETER)
    • KT-54366 K2: no JVM BE specific diagnostics (in particular CONFLICTING_JVM_DECLARATIONS) in 1.8
    • KT-35187 NullPointerException on compiling suspend inline fun with typealias to suspend function type
    • KT-54275 K2: "IllegalArgumentException: KtParameter is not a subtype of class KtAnnotationEntry for factory REPEATED_ANNOTATION"
    • KT-53656 "IllegalStateException: typeParameters == null for SimpleFunctionDescriptorImpl" with recursive generic type parameters
    • KT-46727 Report warning on contravariant usages of star projected argument from Java
    • KT-53197 K2: 'init' hides member of supertype 'UIComponent' and needs 'override' modifier
    • KT-53867 K2: @JvmRecord does not compile to a java record
    • KT-53964 K2 is unable to work with Java records
    • KT-53349 K2: TYPE_MISMATCH caused by non-local return
    • KT-54100 "Type variable TypeVariable(P) should not be fixed" crash in code with errors
    • KT-54212 K2: cannot calculate implicit property type
    • KT-53699 K2: Exception during IR lowering in code with coroutines
    • KT-54192 Warn about unsupported feature on generic inline class parameters
    • KT-53723 Friend modules aren't getting passed to cache build during box tests
    • KT-53873 K2: Duplicated diagnostics reported from user type ref checkers
    • KT-50909 "VerifyError: Bad type on operand stack" caused by smartcasting for nullable inline class property in class
    • KT-54115 Restore Psi2IrTranslator constructor from 1.7.20
    • KT-53908 K2: Self-referencing generics in Java class causes New Inference Error (IE: class Foo<T extends Foo>)
    • KT-53193 K2: compile error on project that compiles fine with normal 1.7.10
    • KT-54062 K2 Invalid serialization for type-aliased suspend function type with extension receiver
    • KT-53953 Forbid usages of super or super if in fact it accesses an abstract member
    • KT-47473 NI: Missed UPPER_BOUND_VIOLATED diagnostics if use type aliases with type parameters
    • KT-54049 K2: false positive MANY_IMPL_MEMBER_NOT_IMPLEMENTED
    • KT-30054 Wrong approximation if nullable anonymous object with implemented interface is used
    • KT-53751 Postpone IgnoreNullabilityForErasedValueParameters feature
    • KT-53324 Implement Enum.entries lowering on K/N
    • KT-44441 K2: report redeclaration error if there is a Java class with the same name as the Kotlin class
    • KT-53807 No warning about declaringClass on an enum value
    • KT-53493 K2: val on function parameter counts as just warning
    • KT-53435 K2: "IllegalArgumentException: class KtValueArgument is not a subtype of class KtExpression for factory ANNOTATION_ARGUMENT_MUST_BE_CONST" if string in nested annotation is concatenated
    • KT-52927 AssertionError: LambdaKotlinCallArgumentImpl
    • KT-53922 Make Enum.entries unstable feature to poison binaries
    • KT-53783 Exception during psi2ir when declaring expect data object
    • KT-53622 [OVERLOAD_RESOLUTION_AMBIGUITY] when enum entry called 'entries' is present in K2
    • KT-41670 JVM IR: AbstractMethodError when using inheritance for fun interfaces
    • KT-53178 K2: implement diagnostics for serialization plugin
    • KT-53804 Restore old and incorrect logic of generating InnerClasses attributes for kotlin-stdlib
    • KT-52970 Default value constant in companion object works on JVM and JS, but fails on native
    • KT-51114 FIR: Support DNN checks
    • KT-27936 Write InnerClasses attribute for all class names used in a class file
    • KT-53719 Parsing regression on function call with type arguments and labeled lambda
    • KT-53261 Evaluate effect from inline for primitive types
    • KT-53706 K2: Context receivers are not resolved on properties during type resolution stage
    • KT-39492 Kotlin.Metadata's packageName field cannot be an empty string
    • KT-53664 Ir Interpreter: unable to evaluate name of function reference marked with JvmStatic from another module
    • KT-52478 [Native] Partial linkage: Building native binary from cached KLIBs fails if one library depends on removed nested callable member from another one
    • KT-48822 CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtProperty - ConcurrentModificationException
    • KT-50281 IllegalStateException: unsupported call of reified inlined function
    • KT-50083 Different error messages in android and JVM (Intrinsics.checkNotNullParameter).
    • KT-53236 Support Enum.entries codegen on JVM/IR BE
    • KT-41017 FIR: should we support smartcast after null check
    • KT-53202 "ISE: Descriptor can be left only if it is last" after direct invoke optimization on a capturing lambda
    • KT-46969 @BuilderInference with nested DSL scopes cause false-positive scope violation in Kotlin 1.5
    • KT-53257 FIR: Improper context receiver argument is chosen when there are two extension receiver candidates
    • KT-53090 Anonymous function and extension function literals are generated as classes even with -Xlambdas=indy
    • KT-53208 K2: Cannot get annotation for default interface method parameter when compiled with -Xuse-k2
    • KT-53184 K2: NoSuchMethodError on KProperty1.get() referenced via nullable typealias
    • KT-53198 K2: Return type mismatch: expected kotlin/Unit, actual kotlin/Unit?
    • KT-53100 Optimization needed: (CONSTANT_PRIMITIVE(x: T?)) => x
    • KT-49875 [FIR] Support infering PRIVATE_TO_THIS visibility
    • KT-53024 Refactor FIR renderer to composable architecture
    • KT-50995 [FIR] Support SAM with receiver plugin
    • KT-53148 K1: introduce warning for inline virtual member in enum
    • KT-49847 Devirtualization fails to eliminate boxing in function reference context
    • KT-52875 Extension function literal creation with -Xlambdas=indy fails with incorrect arguments
    • KT-53072 INVALID_IF_AS_EXPRESSION error isn't shown in the IDE (LV 1.8)
    • KT-52985 Native: a function with type T? returned a kotlin.Unit instead of null
    • KT-52020 FIR warning message includes internal rendering
    • KT-48778 -Xtype-enhancement-improvements-strict-mode not respecting @NonNull annotation for property accesses?
    IDE
    Fixes
    • KTIJ-22357 CCE “class org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl cannot be cast to class org.jetbrains.kotlin.fir.types.FirResolvedTypeRef” in K2
    • KT-55150 Argument for @NotNull parameter 'scope' of org/jetbrains/kotlin/resolve/AnnotationResolverImpl.resolveAnnotationType must not be null
    • KTIJ-22165 IDE notification to promote users to migrate to the new Kotlin/JS toolchain
    • KTIJ-22166 IDE notification (or something else) about JPS and Maven support for Kotlin/JS is deprecated
    • KT-53543 Rework light classes for file facade
    • KT-48773 Investigate the possibility of removing dependency on old JVM backend in light classes
    • KTIJ-19699 IDE: False positive type mismatch in Java code for Kotlin nested class non-direct inheritor from external library
    • KT-51101 FIR IDE: Exception on "Show Type Info" action
    • KTIJ-22295 MPP, IDE: False positive UPPER_BOUND_VIOLATED when JVM module implements the generic interface from MPP module and the type parameter is not equal to itself.
    • KT-51656 FIR IDE: ProgressCancelled exception is masked in the compiler during resolve
    • KT-51315 FIR IDE: move out base modules from fe10 plugin to reuse in k2 plugin
    • KTIJ-22323 K2: ISE during resolve of stdlib calls from the stdlib
    • KTIJ-21391 Generate -> Override methods : don't delegate to abstract methods
    • KT-53097 Extract common part of light classes to another module
    • KTIJ-22354 FIR LC: annotation owner is always null
    • KTIJ-22157 Kotlin call resolver leaks user code when reporting exception
    IDE. Completion
    • KTIJ-22552 Kotlin: 'for loop' postfix completion doesn't work - "Fe10SuggestVariableNameMacro must be not requested from main classloader"
    • KTIJ-22503 Support code completion for data objects
    IDE. Debugger
    • KT-51755 Compilation exception with scripting compilation during debug session
    • KTIJ-21963 Debugger / IR: Expression evaluation of the debugger doesn't work
    IDE. Decompiler, Indexing, Stubs
    • KTIJ-22750 Initialize Kotlin stub element types lazily
    • KTIJ-18094 IDE: "AssertionError: Stub count doesn't match stubbed node length" with minified Android AAR library
    • KTIJ-17632 IndexOutOfBoundsException: Cannot decompile a class located in minified AAR
    IDE. Gradle Integration
    • KT-48135 In the IDE import, reuse dependency granular source set KLIBs across multi-project build to avoid duplicate external libraries
    • KTIJ-22345 False positive unresolved reference for members of subclasses of expect classes.
    • KT-53514 HMPP: False positive for None of the following functions can be called with the arguments supplied. with Enum in common module
    • KT-51583 Gradle 7.4+ | SamplesVariantRule interference: Could not resolve all files for configuration ':kotlinKlibCommonizerClasspath'
    • KTIJ-21077 Dependency matrix does not work with Jetpack compose / multiplatform projects
    IDE. Inspections and Intentions
    • KTIJ-19531 Adapt changes about new rules for method implementation requirements
    • KTIJ-22087 Support IDE inspections for upcoming data objects
    • KTIJ-20510 Quick fix to implement and call correct super method in case of inheritance with defaults
    • KTIJ-20170 Provide quickfix for deprecated resolution to private constructor of sealed class
    • KTIJ-22630 FIR IDE: Lazy resolve exception after invocation of Override members action on value class
    • KT-49643 Intentions: "Implement members" fails when base type function declaration uses unresolved generic types
    IDE. JS
    • KTIJ-22167 Make JS IR default in projects created by wizard
    • KTIJ-22332 Wizard: Kotlin/JS projects: cssSupport DSL should be updated
    IDE. KDoc
    • KTIJ-22324 K2 IDE: implement reference resolve inside KDocs
    IDE. Multiplatform
    • KTIJ-19566 New Project Wizard: Update HMPP-related flags in multiplatform wizards
    IDE. Navigation
    • KT-51314 FIR IDE: show Kotlin declarations in search symbol
    • KTIJ-22755 Find usage for constructor from kotlin library doesn't work for secondary constructor usages
    IDE. Script
    • KTIJ-22598 Add warning for standalone scripts in source roots
    • KT-54325 .settings.gradle.kts and .init.gradle.kts are reported as standalone scripts
    IDE. Structural Search
    • KTIJ-21986 KSSR: "CodeFragment with non-kotlin context should have fakeContextForJavaFile set: originalContext = null" warning shows up when replacing
    IDE. Tests Support
    • KT-50269 FIR IDE: Allow running tests via gutter
    IDE. Wizards
    • KTIJ-23537 Wizard: projects with Android modules require higher sdkCompileVersion
    • KTIJ-23525 Wizard: Compose multiplatform: project won't build and require higher compileSdkVersion
    • KTIJ-22763 New Project Wizard: remove deprecated Android extensions plugin from Android target in the project constructor
    • KTIJ-22481 Wizard: Kotlin -> Browser application (gradle groove). Build error
    JavaScript
    Fixes
    • KT-55097 KJS / IR + IC: Using an internal function from a friend module throws an unbound symbol exception
    • KT-54406 Kotlin/JS: build with dependencies fails with "Could not find "kotlin" in [~/.local/share/kotlin/daemon]"
    • KT-53074 Make JS IR BE default in toolchain (gradle & CLI)
    • KT-50589 UTF-8 Instability in kotlin.js.map
    • KT-54934 KJS / IR + IC: Suspend abstract function stubs are generated with unstable lowered ic signatures
    • KT-54895 KJS / IR + IC: broken cross module references for function default param wrappers
    • KT-54520 KJS / IR Allow IdSignature clashes
    • KT-54120 JS IR + IC: pointless invalidation of dependent code after modifying companions
    • KT-53986 KJS / IR + IC: compiler produces different JS file names with IC and without IC
    • KT-54010 JS IR + IC: Force IC cache invalidation after updating language version or features
    • KT-53931 KJS / Gradle: Regression with 1.7.20-RC: ReferenceError: println is not defined
    • KT-53968 Kotlin/JS: no UninitializedPropertyAccessException on access to non-initialized lateinit property defined in dependencies
    • KT-54686 KJS / IR: Incorrect generation of signatures when one of argument is nested class
    • KT-54479 KJS / IR + IC: Adding or removing companion fields leads java.lang.IllegalStateException in the compiler IC infrastructure
    • KT-54382 KJS / IR: Wrong type check for inheritors of suspend functions
    • KT-54323 KJS / IR + IC: Intrinsics from stdlib may lose their dependencies in incremental rebuild
    • KT-53361 KJS / IR: No debug info is generated for in-line js code
    • KT-53321 Implement Enum.entries lowering on JS/IR
    • KT-53112 KJS IR turn on IC infra by default
    • KT-50503 Kotlin/JS: IR + IC: compileTestDevelopmentExecutableKotlinJs fails with ISE: "Could not find library" after removing module dependency
    • KT-54011 JS IR + IC: EnumEntries don't work well when IC is enabled
    • KT-53672 KJS / IR: "IndexOutOfBoundsException: Index 0 out of bounds for length 0" caused by function reference to extension function of reified type variable
    • KT-43455 KJS: IR. Incremental compilation problem with unbound symbols
    • KT-53539 KJS: Exported class inherited non-exported class shows warning
    • KT-53443 KJS/IR: NullPointerException caused by anonymous objects inside lambdas
    • KT-52795 K/JS and K/Native IR-validation/compilation errors for a valid kotlin code
    • KT-52805 KJS/IR: Invalid call of inline function in also block
    • KT-51151 KJS / IR: Wrong overloaded generic method with receiver is called
    • KT-52830 KJS/IR: Sourcemap disabling doesn't work
    • KT-52968 KJS / IR: Buggy generation of overridden methods
    • KT-53063 KJS / IR + IC: undefined cross module reference for implemented interface functions
    • KT-51099 KJS / IR + IC: Cache invalidation doesn't check generic class variance annotations (in, out)
    • KT-51090 KJS / IR + IC: Cache invalidation doesn't check suspend qualifier
    • KT-51088 KJS / IR + IC: Cache invalidation doesn't check class qualifiers (data, inline)
    • KT-51083 KJS / IR + IC: Cache invalidation doesn't check inline function which was non inline initially
    • KT-51896 KJS / IR + IC: Cache invalidation doesn't trigger rebuild for fake overridden inline functions
    Language Design
    • KT-48385 Deprecate confusing grammar in when-with-subject
    • KT-48516 Forbid @Synchronized annotation on suspend functions
    • KT-41886 Ability to require opt-in for interface implementation, but not for usage
    • KT-34943 OVERLOAD_RESOLUTION_AMBIGUITY inconsistent with the equivalent Java code
    • KT-51334 Implement type-bound label this@Type
    Libraries
    New Features
    • KT-21007 Provide Kotlin OSGI Bundle with extensions for JRE8 (and JRE7)
    • KT-54082 Comparable and subtractible TimeMarks
    • KT-52928 Provide copyToRecursively and deleteRecursively extension functions for java.nio.file.Path
    • KT-49425 Update OptIn documentation to reflect latest design changes
    • KT-54005 Allow calling declaringJavaClass on Enum
    • KT-52933 rangeUntil members in built-in types
    Performance Improvements
    • KT-53508 Cache typeOf-related KType instances when kotlin-reflect is used
    Fixes
    • KT-51907 Switch JVM target of the standard libraries to 1.8
    • KT-54835 Document that Iterable.all(emptyCollection) returns TRUE.
    • KT-54168 Expand on natural order in comparator docs
    • KT-53277 Stabilize experimental API for 1.8
    • KT-53864 Review deprecations in stdlib for 1.8
    • KT-47707 Remove the system property and the brittle contains optimization code itself
    • KT-52336 Different behavior on JVM and Native in stringBuilder.append(charArray, 0, 1)
    • KT-53927 Remove deprecation from ConcurrentModificationException constructors
    • KT-53152 Introduce EnumEntries to stdlib as backing implementation of Enum.entries
    • KT-53134 stdlib > object Charsets > not thread safe lazy initialization
    • KT-51063 Gradle project with JPS runner: "JUnitException: Failed to parse version" JUnit runner internal error with JUnit
    • KT-52908 Native: setUnhandledExceptionHook swallows exceptions
    Native
    • KT-51043 Kotlin Native: ObjC-Interop: kotlin.ClassCastException: null cannot be cast to kotlin.Function2
    • KT-50786 Native: prohibit suspend calls inside autoreleasepool {}
    • KT-52834 Implement test infrastructure for K2/Native
    Native. C Export
    • KT-36878 Reverse C Interop: incorrect headers generation for primitive unassigned type arrays
    • KT-53599 [Reverse C Interop] Provide box/unbox API for unsigned primitive types
    • KT-41904 Kotlin/Native : error: duplicate member for interface and function with the same name
    • KT-42830 [Reverse C Interop] Add API to get value of boxed primitives
    • KT-39496 K/N C: optional unsigned types as function parameters crash the compiler
    • KT-39015 Cannot compile native library with nullable inline class
    Native. C and ObjC Import
    • KT-54738 Cocoapods cinterop: linking platform.CoreGraphics package
    • KT-54001 Kotlin/Native: support header exclusion in cinterop def files
    • KT-53151 Native: Custom declarations in .def don't work with modules, only headers
    Native. ObjC Export
    • KT-53680 Obj-C refinement annotations
    • KT-54119 Native: runtime assertion failed due to missing thread state switch
    • KT-42641 Don't export generated component* methods from Kotlin data classes to Obj-C header
    Native. Platform Libraries
    • KT-54225 Native: update to Xcode 14.1
    • KT-54164 Native: commonizer fails on CoreFoundation types
    • KT-39747 Why is there no WinHttp API in Kotlin/Native's Windows API?
    Native. Runtime
    • KT-49228 Kotlin/Native: Allow to unset unhandled exception hook
    • KT-27305 Fix FILE macro inside RuntimeCheck and RuntimeAssert
    Native. Runtime. Memory
    • KT-54498 Deprecation message of 'FreezingIsDeprecated' is not really helpful
    • KT-53182 New memory manager: Unexpected memory usage on IOS
    Native. Stdlib
    • KT-52429 Small Usability Improvements for Worker API
    Reflection
    • KT-54629 Incorrectly cached class classifier
    • KT-54611 KTypeImpl does not take into account class loader from the classifier property
    • KT-48136 Make Reflection.getOrCreateKotlinPackage use cache when kotlin-reflect is used
    • KT-50705 Use ClassValue to cache KClass objects in kotlin-reflect
    • KT-53454 Properly cache the same class's KClass when it's loaded by multiple classloaders in getOrCreateKotlinClass
    Specification
    • KT-54210 Update Kotlin specification to mention that since 1.8 generics in value classes are allowed
    Tools. CLI
    • KT-54116 Add JVM target bytecode version 19
    • KT-53278 Support values 6 and 8 for -Xjdk-release
    • KT-46312 CLI: Kotlin runner should use platform class loader to load JDK modules on Java 9+
    Tools. Commonizer
    • KT-54310 Commonizer fails on 1.8.0-dev K/N distributions
    • KT-48576 [Commonizer] platform.posix.pselect not commonized in Ktor
    Tools. Compiler Plugins
    • KT-46959 Kotlin Lombok: Support generated builders (@Builder)
    • KT-53683 Unresolved reference compilation error occurs if a file is annotated with @ Singular and has any guava collection type : ImmutableTable, ImmutableList or else
    • KT-53657 [K2] Unresolved reference compilation error occurs if a field is annotated with @ Singular and has type NavigableMap without explicit types specification
    • KT-53647 [K2] Unresolved reference compilation error occurs if a field is annotated with @ Singular and has type Iterable<>
    • KT-53724 Param of the @ Singular lombok annotation ignoreNullCollections=true is ignored by kotlin compiler
    • KT-53451 [K2] References to methods generated by @ With lombok annotation can't be resolved with enabled K2 compiler
    • KT-53721 [K2] There is no compilation error while trying to add null as a param of the field with non-null type
    • KT-53370 Kotlin Lombok compiler plugin can't resolve methods generated for java boolean fields annotated with @ With annotation
    Tools. Compiler plugins. Serialization
    • KT-54878 JVM/IR: java.lang.ClassCastException: class org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl cannot be cast to class org.jetbrains.kotlin.ir.types.IrTypeProjection on serializer<Box<*>>()
    • KT-55340 Argument for kotlinx.serialization.UseSerializers does not implement KSerializer or does not provide serializer for concrete type
    • KT-55296 Improve exceptions in serialization plugin
    • KT-55180 KJS: regression in serialization for Kotlin 1.8.0-beta
    • KT-53157 Recursion detected in a lazy value under LockBasedStorageManager in kotlinx.serialization
    • KT-54297 Regression in serializable classes with star projections
    • KT-49660 kotlinx.serialization: IndexOutOfBoundsException for parameterized sealed class
    • KT-43910 JS IR: Serialization with base class: "IndexOutOfBoundsException: Index 0 out of bounds for length 0"
    Tools. Daemon
    • KT-52622 Kotlin/JS, Kotlin/Common compilations start Kotlin daemon incompatible with Kotlin/JVM compilation on JDK 8
    Tools. Gradle
    New Features
    • KT-27301 Expose compiler flags via Gradle lazy properties
    • KT-53357 Change single build metrics property
    • KT-50673 Gradle: KotlinCompile task(s) should use @NormalizeLineEndings
    • KT-34464 Kotlin build report path not clickable in the IDE
    Performance Improvements
    • KT-51525 [Gradle] Optimize evaluating args for compile tasks
    • KT-52520 Remove usage of reflection from CompilerArgumentsGradleInput
    Fixes
    • KT-48843 Add ability to disable Kotlin daemon fallback strategy
    • KT-55334 kaptGenerateStubs passes wrong android variant module names to compiler
    • KT-55255 Gradle: stdlib version alignment fails build on dynamic stdlib version.
    • KT-55363 [K1.8.0-Beta] Command line parsing treats plugin parameters as source files
    • KT-54993 Raise kotlin.jvm.target.validation.mode check default level to error when build is running on Gradle 8+
    • KT-54136 Duplicated classes cause build failure if a dependency to kotlin-stdlib specified in an android project
    • KT-50115 Setting toolchain via Java extension does not configure 'kotlinOptions.jvmTarget' value when Kotlin compilation tasks are created eagerly
    • KT-55222 Migrate AndroidDependencyResolver to the new Gradle API
    • KT-55119 There is no validation for different jvmTarget and targetCompatibility values in multiplatform projects with jvm target and used java sources
    • KT-55102 Compile java task fails with different target version in pure kotlin project
    • KT-54995 [1.8.0-Beta] compileAppleMainKotlinMetadata fails on default parameters with No value passed for parameter 'mustExist'
    • KT-35003 Automatically set targetCompatibility for kotlin-jvm projects to work with gradle 6 metadata
    • KT-45335 kotlinOptions.jvmTarget conflicts with Gradle variants
    • KT-48798 Android: going from one to more than one productFlavor causes inputs of commonSourceSet$kotlin_gradle_plugin property of compileKotlin task to change
    • KT-55019 Gradle sync: UnknownConfigurationException when adding implementation dependencies to a Kotlin with Java compilation
    • KT-55004 jvmTarget value is ignored by depending modules if a task "UsesKotlinJavaToolchain" is configured for all project modules using allProjects {}
    • KT-54888 Add Gradle property to suppress kotlinOptions.freeCompilerArgs modification on execution phase
    • KT-54399 Undeprecate 'kotlinOptions' DSL
    • KT-54306 Change the naming of newly added Compiler*Options classes and interfaces
    • KT-54580 KotlinOptions in AbstractKotlinCompilation class are deprecated
    • KT-54653 java.lang.NoClassDefFoundError: kotlin/jdk7/AutoCloseableKt exception if a dependency to the kotlin-stdlib is added
    • KT-52624 Compatibility with Gradle 7.3 release
    • KT-54703 Stdlib substitution does not work with JPMS modules
    • KT-54602 Prevent leaking Gradle Compile DSL types into compiler cli runtime
    • KT-54439 Project failed to sync Native LaguageSettings to compiler options in afterEvaluate
    • KT-53885 Bump minimal supported Gradle version to 6.8.3
    • KT-53773 Protect and system properties can contain sensitive data
    • KT-53732 Add custom values limits for build scan reports
    • KT-52623 Compatibility with Gradle 7.2. release
    • KT-51831 Gradle: remove kotlin.compiler.execution.strategy system property
    • KT-51679 Change deprecation level to error for KotlinCompile setClasspath/getClasspath methods
    • KT-54335 Kotlin build report configuration. There is no validation for SINGLE_FILE output if the required kotlin.build.report.single_file property is empty or absent
    • KT-54356 Kotlin build report configuration. Wrong path is used for the property kotlin.internal.single.build.metrics.file
    • KT-53617 KotlinCompilerExecutionStrategy value is ignored by depending modules if configure once for all project modules using allProjects {}
    • KT-53823 Kotlin Gradle Plugin uses deprecated Gradle API: Provider.forUseAtConfigurationTime()
    • KT-54142 Increase Kotlin Gradle plugin Gradle target API to 7.5
    • KT-50161 Android variant filter breaks KotlinCompile cache compatibility
    • KT-54113 LanguageSettings to KotlinNativeLink.toolOptions sync are executed on the wrong context
    • KT-53830 Versions of kotlin-stdlib-jdk8 and kotlin-stdlib-jdk7 aren't overrided if added as transitive dependencies to kotlin-stdlib
    • KT-54112 Missing target input on KotlinNativeLink task
    • KT-45879 Documentation: Wrong kotlin languageVersion "1.6 (EXPERIMENTAL)"
    • KT-54103 Remove JvmTarget.JVM_1_6 from generated Gradle compiler type
    • KT-52959 KMP code is breaking Gradle project isolation
    • KT-50598 MULTIPLE_KOTLIN_PLUGINS_SPECIFIC_PROJECTS_WARNING is only shown on first build
    • KT-53246 Gradle: Special characters in paths of errors and warnings should be escaped
    • KT-47730 How to avoid stdlib coming from Kotlin gradle plugin
    • KT-52209 Corrupted cache and non-incremental build if produce caches "in process" and restore then compiling with kotlin daemon
    • KT-41642 "TaskDependencyResolveException: Could not determine the dependencies" when trying to apply stdlib
    • KT-53390 Drop usage of -Xjava-source-roots when passing java sources required for Kotlin compilation
    • KT-52984 Kotlin Gradle plugin is misbehaving by resolving DomainObjectCollection early
    • KT-38622 Non-incremental compilation because of R.jar with Android Gradle plugin 3.6
    • KT-38576 AnalysisResult.RetryWithAdditionalRoots crashes during incremental compilation with java classes in classpath
    Tools. Gradle. Cocoapods
    • KT-54314 Cocoapods: Signing pod dependency for Xcode 14
    • KT-54060 Xcode 14: disable bitcode embedding for Apple frameworks
    • KT-53340 Change default linking type for frameworks registered by cocoapods plugin
    • KT-53392 Deprecate and delete downloading pod dependencies by direct link
    • KT-53695 Build of macOS application fails if a framework is integrated via Cocoapods plugin
    Tools. Gradle. JS
    • KT-53367 KJS: Migrate cssSupport API
    • KT-45789 KJS / IR: Transitive NPM dependencies are not included in PublicPackageJsonTask output
    • KT-55099 K/JS: Second declaration of JS target without compiler type report warning incorrectly
    • KT-52951 [KGP/JS] Browser test target registration via properties
    • KT-52950 KJS: Report if yarn.lock was updated during built
    • KT-53374 KJS / Gradle: Implement IDEA sync detection logic via ValueSource to improve configuration cache support
    • KT-53381 Kotlin/JS: with erased kotlin-js-store/ and reportNewYarnLock = true the task kotlinUpgradeYarnLock always fails
    • KT-53788 KJS / Gradle: Disable Gradle build cache for KotlinJsDce when development mode is enabled
    • KT-53614 Kotlin/JS upgrade npm dependencies
    Tools. Gradle. Multiplatform
    New Features
    • KT-53396 Support 'implementation platform()' by gradle kotlin mpp plugin for JVM target
    • KT-40489 MPP / Gradle: support BOM (enforcedPlatform) artifacts in source set dependencies DSL
    Performance Improvements
    • KT-52726 [MPP] Optimize caching/performance/call-sites of 'compilationsBySourceSets'
    Fixes
    • KT-54634 MPP: Test Failure causes: KotlinJvmTest$Executor$execute$1 does not define failure
    • KT-35916 Gradle MPP plugin: Configurations for a main compilation and its default source set have different naming
    • KT-46960 Repeated kotlin/native external libraries in project
    • KT-27292 MPP: jvm { withJava() }: Gradle build: Java source under Kotlin root is resolved while building, but does not produce output class files
    • KT-34650 Naming clash in MPP+Android: androidTest vs androidAndroidTest
    • KT-54387 Remove MPP alpha stability warning
    • KT-31468 Targets disambiguation doesn't work if a depending multiplatform module uses withJava() mode
    • KT-54090 Take an Apple test device from the device list
    • KT-54301 KotlinToolingVersionOrNull: IllegalArgumentException
    • KT-53256 Implement K/N compiler downloading for KPM
    • KT-45412 KotlinCompilation: Make sure .kotlinSourceSets and .allKotlinSourceSets include the default source set
    • KT-49202 Tests on android target can't be executed in multiplatform project if dependency to kotlin-test framework is provided as a single dependency and tests configured to be executed via Junit5
    Tools. Gradle. Native
    New Features
    • KT-43293 Support Gradle configuration caching with Kotlin/Native
    • KT-53107 Add arm64 support for watchOS targets (Xcode 14)
    Fixes
    • KT-53704 Native cinterop: eager header path calculation
    • KT-54814 Kotlin/Native: Github Actions: Testing watchOSX64 with Xcode 14 — Invalid device: Apple Watch Series 5
    • KT-54627 Native: :commonizeNativeDistribution with configuration cache enabled fails even when set to warn on JDK 17
    • KT-54339 Link tasks fail if Gradle Configuration Cache is enabled
    • KT-53191 Native cinterop sync problem with gradle
    • KT-54583 watchosDeviceArm64 target shouldn't register test tasks
    • KT-52303 Gradle / Native: Build tasks ignore project.buildDir
    • KT-54442 Gradle iOS test tasks fail if a device is not selected explicitly
    • KT-54177 Gradle: Deprecate enableEndorsedLibs flag
    • KT-47355 Support macos target for FatFramework task
    • KT-53339 MPP / CocoaPods: The static framework fails to install on a real iOS device
    • KT-31573 Missing description for Native Gradle tasks
    • KT-53131 Gradle Sync: "NoSuchElementException: Array contains no element matching the predicate" with CocoaPods
    • KT-53686 Task assembleReleaseXCFramework fails with "error: the path does not point to a valid framework" if project name contains a dash
    Tools. Incremental Compile
    • KT-54144 New IC: "IllegalStateException: The following LookupSymbols are not yet converted to ProgramSymbols" when changing an inline function with custom JvmName
    • KT-53871 New IC: "IllegalStateException: The following LookupSymbols are not yet converted to ProgramSymbols" when changing an inline property accessor
    • KT-19804 Relocatable IC caches
    Tools. JPS
    • KT-45474 False positive NO_ELSE_IN_WHEN on sealed class with incremental compilation
    • KT-54228 Switching abstract to sealed classes causes incremental issue
    • KT-38483 JPS: Stopping compilation causes IDE CompilationCanceledException
    • KT-50310 False positive NO_ELSE_IN_WHEN on incremental build when adding sealed classes
    • KT-48813 Move cache version to compiler
    • KTIJ-921 JPS: FileNotFoundException on project build in mixed Kotlin/Scala project
    Tools. Kapt
    • KT-54187 JVM IR + kapt: incorrect modifier final is generated for nested enum in interface
    • KT-48827 Remove 'kapt.use.worker.api' property
    Tools. Scripts
    • KT-54355 Scripts: Internal compiler error (languageVersion=1.9)
    • KT-53009 Scripting: NDFDE “Descriptor wasn't found for declaration SCRIPT” on using script definition with kotlin from master

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 0
  • Autoconfigure for updated Sleuth Brave class

    Autoconfigure for updated Sleuth Brave class

    Between Sleuth 2.x and 3.x, the Brave Auto Configuration class package and name changed. This updates the GrpcCommonTraceAutoConfiguration to wait to load after either version is present.

    Currently, people who try to use Sleuth 3.x and grpc-spring-boot-starter might run into problems, like I did, if GrpcCommonTraceAutoConfiguration runs first. It will create the grpcTracing bean, and then BraveAutoConfiguration will try to create a bean with the same name and fail.

    opened by clamey 0
  • Facing Dependency Error on Spring Boot 3 Update

    Facing Dependency Error on Spring Boot 3 Update

    The context

    I am trying to update my project on Spring boot 3 that has a dependency on latest grpc starter module.

    The question

    I am facing a circular dependency error.

    Sample Code

    @Configuration
    @GrpcClientBeans({
      @GrpcClientBean(clazz = CSBlockingStub.class, client = @GrpcClient("rc"))
    })
    class GrpcStubConfig {
      @Bean
      public CSBlockingStub csBlockingStub(CSBlockingStub stub) {
        return stub;
      }
    }
    

    The application's environment

    Which versions do you use?

    • Spring (boot): 3.0.0
    • grpc-java: 1.51.1
    • grpc-spring-boot-starter: 2.14.0.RELEASE
    • java: version + architecture (64bit?) 17 + 64bit

    Additional information

    • Did it ever work before?

    It was working fine on spring boot 2.7.*

    Error Message https://github.com/yidongnan/grpc-spring-boot-starter/issues/810#issuecomment-1359289765

    question feedback required 
    opened by adi-wtag 3
  • Update dependency org.springframework.cloud:spring-cloud-dependencies to v2022

    Update dependency org.springframework.cloud:spring-cloud-dependencies to v2022

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.springframework.cloud:spring-cloud-dependencies (source) | 2021.0.5 -> 2022.0.0 | age | adoption | passing | confidence |


    Release Notes

    spring-cloud/spring-cloud-release

    v2022.0.0


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 0
Releases(v2.14.0.RELEASE)
  • v2.14.0.RELEASE(Nov 21, 2022)

    Changes

    • BREAKING: Add support for call attribute based authorization checks by @ST-DDT in #742
      • Only breaks if you implemented custom filters
      • Now supports filtering by user IP
    • Replace metric implementation with external/official one by @ST-DDT in #736
    • Replace deprecated io.grpc.services.HealthStatusManager by @marcindabrowski in #658
    • Only create a StubTransformer of CallCrendentials if there are no others by @gurel in #646
      • You might have to create the bean yourself now/add it to your existing stub transformer

    Features

    • Support @Order on interceptor bean factory methods by @ST-DDT in #737
    • Add support for client stub constructor injection by @xJoeWoo in #749
    • Add option to turn off the grpc HealthIndicator by @westonlee in #699

    Fixes

    • Fix creation of Bearer Token using CallCredentialsHelper.bearerAuth(Supplier) by @vitorluis in #642
    • Fix constructing InProcessGrpcServerFactory with GrpcServerConfigurer(s) by @blackhuman in #654
    • Use Grpc default scheme if no target is defined by @kyle-wong-knewton in #687
    • Fix some warnings from code analysis by @ST-DDT in #734
    • Fix keystore JKS format auto detection by @ST-DDT in #738
    • Improve error message if there is no GrpcContext assigned/active by @ST-DDT in #777

    Documentation

    • Correct tag names according to Micrometer's docs by @seckin206 in #645
    • Fix kubernetes config doc by @coltstrgj in #683
    • Add non HTTP/2 error to troubleshooting by @ST-DDT in #764
    • New Crowdin updates by @yidongnan in #765
    • Update metric tag names by @ST-DDT in #766
    • Add warning to kubernetes service docs by @ST-DDT in #767

    Dependencies

    New Contributors

    • @vitorluis made their first contribution in #642
    • @gurel made their first contribution in #646
    • @blackhuman made their first contribution in #654
    • @marcindabrowski made their first contribution in #658
    • @seckin206 made their first contribution in #645
    • @renovate made their first contribution in #663
    • @coltstrgj made their first contribution in #683
    • @westonlee made their first contribution in #699
    • @kyle-wong-knewton made their first contribution in #687
    • @nurgasemetey made their first contribution in #733
    • @xJoeWoo made their first contribution in #749
    Source code(tar.gz)
    Source code(zip)
  • v2.13.1.RELEASE(Jan 7, 2022)

  • v2.13.0.RELEASE(Nov 26, 2021)

    Fixes

    • Don't reference sleuth directly in the annotation #585
    • Align default keepAlive with gRPC defaults #550

    Improvements

    • @GrpcClientBean annotation to add @GrpcClient channels/stubs to the application context #580
    • Error handling is now supported for streaming calls #586
    • Added grpc server lifecycle events #608
    • Added support for key- and truststores via configuration #605
    • Added dynamic CallCredentials helpers #596
    • Improve authentication capabilities #594
    • Improve DiscoveryClientNameResolver implementation #600 , #429
    • Support max connection idle and age limits #549
    • Update dependencies and plugins #598, #583, #520
    • Improve test script #530

    Examples

    • Log response messages and other data in Interceptor example #578
    • Add consul to automated test suite #530
    • Condense/Simplify examples #539, #531

    Documentation

    • Mention grpcChannel health indicator in docs #606
    • Updated the getting started documentation #609
    • Updated and move compatibility info to version documentation #595
    • Fix client configuration examples with server interceptors #579

    Dependencies

    Acknowledgements

    Thanks to all our contributors:

    • @a-simeshin
    • @cfredri4
    • @luankevinferreira Luan Kevin Ferreira
    • @popfalushi
    Source code(tar.gz)
    Source code(zip)
  • v2.12.0.RELEASE(May 1, 2021)

    Breaking Changes

    • Updated to spring-boot v2.4.x some features might no longer work with v2.3.x (Spring renamed some classes) #508
    • Change metadata from gRPC.port to gRPC_port for cloud discovery #496 , #495
      • Currently the legacy property is evaluated as a fallback, this fallback will be removed in a future release
    • Make grpc-services.jar optional + grpc health service setup is no longer blindly initialized with SERVING #528
      • To restore the original behavior, use the HealthStatusManager#setStatus for each grpc service

    Fixes

    • Fixed potential sensitive data exposure vulnerability #528
    • GrpcAdviceIsPresentCondition breaks beans loading priority #513, #515
    • If the grpc client is unavailable then the service is "out of service" #529
    • Fix GrpcClient#interceptors bean lookup #532

    Improvements

    • Improve build to benefit from incremental builds #512
    • Upgrade dependencies to the latest versions #521
    • Update spring boot to 2.4.x #508

    Examples

    • Add nacos example #504

    Documentation

    • Add Custom NameResolverProvider section to the docs #525
    • Add a version mismatch section to the docs trouble shooting section #524

    Dependencies

    Acknowledgements

    Thanks to all our contributors:

    • @donbeave Alexey Zhokhov
    • @genuss Alexey Genus
    • @totorean Ami Totorean
    • @xieyucan Bruce Xie
    Source code(tar.gz)
    Source code(zip)
  • v2.11.0.RELEASE(Feb 19, 2021)

    Changes/Improvements

    • Annotation driven Exception handling #485, #465, #358
    • Added option to gracefully shutdown #491, #454
      • The server now waits for all grpc requests to finish before continuing with the shutdown
    • Added support for zookeeper service discovery #474, #475
    • Use ServerCall.Listener#onComplete for metric collection instead of ServerCall#close #447
      • Now it also tracks cancelled calls

    Fixes

    • Update client configuration metadata #494
    • Don't try to setup TLS security for in-process-server #497

    Documentation

    • Improve server getting started docs #479
    • Improve client interceptor documentation #473
    • Fix bad imports in client getting started docs #472
    • Mention gRPCurl on the server testing page #444
    • Improve NameResolverRegistry registration logs #435

    Dependencies

    Acknowledgements

    Thanks to all our contributors:

    • Abhijit Sarkar @asarkar
    • Andjelko Perisic @anjeyy
    • @klboke
    • @LeoBarykin
    • @ZMRWEGO
    Source code(tar.gz)
    Source code(zip)
  • v2.10.1.RELEASE(Aug 24, 2020)

  • v2.10.0.RELEASE(Aug 17, 2020)

    Breaking Changes

    • Simplify interceptor registration #394
      • Lazy collect interceptors and global interceptor configurers
      • Changed API of global interceptor registry and configurers
    • Removed stub creation via private constructors, which causes an incompatibility with kotlin. (The missing kotlin-grpc stub factory will be fixed asap in the next release)

    Changes

    • Change auto configs to use @Configuration(proxyBeanMethods = false)
      • This should improve compatibility with GraalVM's native images #383 #379

    New Features

    • Support 3rd party gRPC Java compilers via StubFactory #375 #382
    • Request connection on startup #377
    • Add option to configure the max metadata size for server #380
    • Add more utility methods to CallCredentialsHelper #387
    • Log connector selection (shaded-netty/netty/in-process) #386
    • Log that the CallCredentials will be applied to all stubs automatically #388
    • Throw exception if grpc-service is registered/implemented twice #392

    Documentation

    • Add example grpcurl usage for Windows #391
    • Document setup for kubernetes #403

    Dependencies

    Acknowledgements

    Thanks to all our contributors:

    • Alexey Genus @genuss
    • Ophir Radnitz @liqweed
    • @jbf154
    Source code(tar.gz)
    Source code(zip)
  • v2.9.0.RELEASE(Jun 15, 2020)

  • v2.8.0.RELEASE(Jun 6, 2020)

  • v2.7.0.RELEASE(Feb 26, 2020)

    Features

    • Support grpc-java 1.26.0+ (also tested with 1.27.1) #328

    Changes

    • Switch to new Listener implementation + use syncContext #322
    • Removed support for the deprecated (String) path based security configuration #318
      • Use the Resource based one instead

    Improvements

    • Change name of grpc-await thread to reflect that it is for grpc #316
    • Detach the server factory bean lifecycle from the server lifecycle bean #317

    Documentation

    • Add client/stub testing documentation #329

    Dependencies

    Source code(tar.gz)
    Source code(zip)
  • v2.6.2.RELEASE(Jan 8, 2020)

    Bug Fixes

    • Fix memory leak in DiscoveryClienNameResolverFactory #320 (Fixes #311)

    Acknowledgements

    Thanks to all our contributors:

    • @Woodrowww
    • Zhanwei Wang @wangzw
    Source code(tar.gz)
    Source code(zip)
  • v2.6.1.RELEASE(Nov 28, 2019)

  • v2.6.0.RELEASE(Nov 11, 2019)

    Features

    • Expose channel connectivity to actuator #285
    • Add support for connecting to the own server #283
    • Use grpc's NameResolverRegistry #280

    Changes

    • Changed priority of discovery clean name resolver to take precendence over dns if configured
      Added config for default scheme
      https://github.com/yidongnan/grpc-spring-boot-starter/commit/3fad0d23e7a40869ff1452c3238683986bec040b

    Improvements

    • Update dependencies #296 #291 #279
    • Update Javadoc Task options #281
    • Improve tests #275

    Documentation

    New documentation

    • Fixes spring-boot-starter-test dependency def #287
    • Javadoc improvements #276
    • Improve documentation #274

    Dependencies

    Acknowledgements

    Thanks to all our contributors:

    • liym @ijliym
    • Tomasz Dziurko @tdziurko
    • Richard Kettelerij @rkettelerij
    Source code(tar.gz)
    Source code(zip)
  • v2.5.1.RELEASE(Aug 16, 2019)

    CVE-Fixes

    Updates grpc-java for CVE-2019-9515 (SETTINGS flood) fix. Users using the grpc-netty server with untrusted clients should upgrade.

    • https://nvd.nist.gov/vuln/detail/CVE-2019-9515
    • https://kb.cert.org/vuls/id/605641/

    Dependency-Updates

    Source code(tar.gz)
    Source code(zip)
  • v2.5.0.RELEASE(Aug 11, 2019)

    Features

    • Add methodType tag to metrics #266
    • Change configuration to use Resources instead of file paths #258 #262
    • Support password encoded private keys #246
    • Implement grpcRequest scope #259 #211
    • Split AuthenticatingServerInterceptor into an interface #250 #249
    • Simplify size limit setup with DataSize #187

    Bug Fixes

    • Discovery: Use service port if custom grpc port is not defined #267 #261
    • Discovery: DiscoveryClientNameResolver does not detect changes properly #241
    • YAML kebab case not working on inProcessName #253 #254

    Documentation

    • Javadoc and comment improvements #265

    Dependencies

    • grpc-java 1.22.1 #255
    • spring-boot 2.1.6 #242
    • spring-cloud Greenwich.SR2 #242
    • protobuf 3.8.0

    Migration

    Change

    grpc.server.security.certificateChainPath=certificates/server.crt
    grpc.server.security.privateKeyPath=certificates/server.key
    grpc.server.security.trustCertCollectionPath=certificates/trusted-clients.crt.collection
    

    to

    grpc.server.security.certificateChain=file:certificates/server.crt
    grpc.server.security.privateKey=file:certificates/server.key
    grpc.server.security.trustCertCollection=file:certificates/trusted-clients.crt.collection
    

    The client properties should be renamed in a similar manner. Currently both the old and the new config options work. But a warning with a migration notice will be shown.

    Acknowledgements

    Thanks to all our contributors:

    • Yeshwanth V Shenoy @yeshwanthvshenoy
    Source code(tar.gz)
    Source code(zip)
  • v2.4.0.RELEASE(Jun 4, 2019)

    Features

    • Order interceptors #214 #233
    • Remove deprecated AuthenticatingClientInterceptors #220
    • Adds simultaneous support for in- and inter-process channels/servers #222
    • Adds configurable ciphers and protocols for clients and servers #223
    • Turn off inter process server #229
    • Support Nacos as service discovery #235

    Bug Fixes

    • Fix wrong BeanPostProcessor bean definition #218

    Documentation

    • Add some additional/missing javadocs and toString() methods to client security #221

    Cleanup

    • Fix formatting and warnings #219
    • Remove deprecated host and port client properties #191

    Dependencies

    • Update gRPC-Java to 1.20 #217
    • Update to Spring-Boot 2.1.5 #228

    Acknowledgements

    Thanks to all our contributors:

    • Daniel Theuke @ST-DDT
    • Rajkiran @rajki
    • NickUfer @NickUfer
    Source code(tar.gz)
    Source code(zip)
  • v1.4.2.RELEASE(Jun 4, 2019)

  • v2.3.0.RELEASE(Apr 7, 2019)

    Features

    • Improve keepAlive support (#177)
    • Use shaded netty by default (#182)
    • Use the property from the sleuth docs (spring.sleuth.scheduled.enabled -> spring.sleuth.grpc.enabled) (#192)
    • Add support for global client properties (#183, #198)
    • Improve error messages during client injection (#201)
    • Some deprecated server properties have been removed (#190)

    Bug Fixes

    • Fix wrong usage of EquivalentAddressGroups in static address resolver (#179, #184)
    • Move trace configuration (#194, #195)
    • Fix broken PLAINTEXT_UPGRADE support (#199, #200)
    • Update example dependencies (#204)
    • Move security configuration (#205, #208)

    Documentation

    • Updated the documentation (#178, #186)
    • Improve javadoc (#188)

    Dependencies

    • Update to gRPC 1.18 (#182)
    • Update to Spring-Boot 2.1.4 (#209)

    Acknowledgements

    Thanks to all our contributors:

    • Daniel Theuke @ST-DDT
    • Possibly Cott @internetstaff
    Source code(tar.gz)
    Source code(zip)
  • v2.2.1.RELEASE(Jan 21, 2019)

    Features

    Expose spring-security's authentication in grpc's context. #170

    Enhance Bearer Auth #169

    Bug Fixes

    Fix discovery client refresh. #171

    Acknowledgements

    Thanks to all our contributors:

    Daniel Theuke @ST-DDT Gregor Eeckels @GregorEeckels Eugen Druzin @githinho

    Source code(tar.gz)
    Source code(zip)
  • v2.2.0.RELEASE(Dec 22, 2018)

    Features

    • Support Spring-Security/Authentication #122 #150 #136

    • Add generator Spring configuration meta data #129

    • Support codecs also on the client side #133

    • Support automatic metric collection #137

    • Support shaded netty #142

    • Automatically create actuator InfoContributor #145

    • Support Java 11 #152

    • Dynamic name resolver factory #157

    Bug Fixes

    • Fixes initialization order issues causing NPEs in @PostConstruct #158

    Dependencies

    • Updated to gRPC-java to 1.17.1

    • Updated to Spring Boot to 2.0.6.RELEASE

    Acknowledgements

    Thanks to all our contributors:

    Daniel Theuke @ST-DDT Gregor Eeckels @GregorEeckels

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0.RELEASE(Oct 30, 2018)

    Features

    • Support for registering compressors/decompressors in gRPC server via @GrpcCodec #96

    • Add properties to set negotiation type and stream decompression #97

    • Add the proto reflection service and properties to turn these services off #88

    • Add support for GrpcClient annotated stubs

    • Add support for global ClientInterceptor or golbal ServerInterceptor annotation

    • Add properties for client auth

    • Refactor ChannelFactory to reduce code duplication and memory leak

    Acknowledgements

    Thanks to all our external contributors:

    Daniel Theuke @ST-DDT

    Source code(tar.gz)
    Source code(zip)
  • v2.0.1.RELEASE(Aug 9, 2018)

  • v2.0.0.RELEASE(Jul 31, 2018)

  • v1.4.1.RELEASE(Jun 18, 2018)

  • v1.4.0.RELEASE(Mar 20, 2018)

  • v1.3.0.RELEASE(Sep 14, 2017)

  • v1.2.0.RELEASE(Jun 30, 2017)

  • v1.1.1.RELEASE(Apr 26, 2017)

  • v1.1.0.RELEASE(Apr 22, 2017)

  • v1.0.1.RELEASE(Mar 6, 2017)

    Release version 1.0.1

    upgrade gRPC-java to 1.1.2 optimization name resolver optimization channel factory support jdk 1.7 version client support keepalive

    Source code(tar.gz)
    Source code(zip)
该仓库中主要是 Spring Boot 的入门学习教程以及一些常用的 Spring Boot 实战项目教程,包括 Spring Boot 使用的各种示例代码,同时也包括一些实战项目的项目源码和效果展示,实战项目包括基本的 web 开发以及目前大家普遍使用的线上博客项目/企业大型商城系统/前后端分离实践项目等,摆脱各种 hello world 入门案例的束缚,真正的掌握 Spring Boot 开发。

Spring Boot Projects 该仓库中主要是 Spring Boot 的入门学习教程以及一些常用的 Spring Boot 实战项目教程,包括 Spring Boot 使用的各种示例代码,同时也包括一些实战项目的项目源码和效果展示,实战项目包括基本的 web 开发以及目前大家普遍使用的前

十三 4.5k Dec 30, 2022
循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Batch、Spring Cloud、Spring Cloud Alibaba、Spring Security & Spring Security OAuth2,博客Spring系列源码:https://mrbird.cc

Spring 系列教程 该仓库为个人博客https://mrbird.cc中Spring系列源码,包含Spring Boot、Spring Boot & Shiro、Spring Cloud,Spring Boot & Spring Security & Spring Security OAuth2

mrbird 24.8k Jan 6, 2023
A springboot-starter that can achieve Intranet penetration. 一款可以实现内网穿透的springboot-starter。

qynat-springboot-starter 基于netty的内网穿透工具在springboot中的整合 protocol协议:protobuf 只需在application.properties中配置少量信息,实现零代码侵入的web项目内网穿透 项目的server端的源码在另一个多模块项目中,

whz11 65 Dec 12, 2022
A springboot-starter that can achieve Intranet penetration. 一款可以实现内网穿透的springboot-starter。

qynat-springboot-starter 基于netty的内网穿透工具在springboot中的整合 protocol协议:protobuf 只需在application.properties中配置少量信息,实现零代码侵入的web项目内网穿透 项目的server端的源码在另一个多模块项目中,

whz11 65 Dec 12, 2022
React 0.68+ Turbo Module starter using codegen with typescript for Objective-C and Java/Kotlin with C++ shared library. 🚀🚀🚀

React 0.68+ Turbo Module starter using codegen with typescript for Objective-C and Java/Kotlin with C++ shared library. ?? ?? ?? Features React Native

Nagish Inc. 358 Jan 3, 2023
Kafka-spring-boot-starter: encapsulated based on spring-kafka

Encapsulation based on spring-kafka not only supports native configuration, but also adds multi data source configuration.

liudong 8 Jan 9, 2023
Tuya 37 Dec 26, 2022
Spring Boot starter for JustAuth Plus.

Spring Boot starter for JustAuth Plus.

Fujie 5 Jun 23, 2022
基于 spring-boot-starter-log4j2:2.6.1 (log4j 2.14.1)

Log4j 2 CVE-2021-44228 测试样本应用 基于 spring-boot-starter-log4j2:2.6.1 (log4j 2.14.1) 可用接口 接口 请求方法 参数 vulnerable_request_get GET v=payload vulnerable_reque

Zhangzhe 3 Mar 23, 2022
An awesome Spring Boot Starter!

spring-boot-tony-starter An awesome Spring Boot Starter! Explore the docs » View Demo · Report Bug · Request Feature Table of Contents About The Proje

徐植君 11 Sep 13, 2022
Create your Java crypto trading bot in minutes. Our Spring boot starter takes care of exchange connections, accounts, orders, trades, and positions so you can focus on building your strategies.

Quick Start | Documentation | Discord | Twitter Create and run your java crypto trading bot in minutes Our Spring boot starter takes care of exchange

Cassandre 442 Jan 3, 2023
Get or Throw Spring boot Starter will help you to hide handling if entity not found.

Get or Throw Spring boot Starter Get or Throw Spring boot Starter will help you to hide handling if entity not found. 1. Setup 2. Usage Library adds c

null 3 Feb 2, 2022
Spring Boot Login and Registration example with MySQL, JWT, Rest Api - Spring Boot Spring Security Login example

Spring Boot Login example with Spring Security, MySQL and JWT Appropriate Flow for User Login and Registration with JWT Spring Boot Rest Api Architect

null 58 Jan 5, 2023
本项目基于springboot进行开发,实现了一系列的spring-boot-starter

项目简介 本项目基于springboot进行开发,实现了一系列的spring-boot-starter,可以作为开发中的工具包进行使用。 模块划分 common-spring-boot-starter:常用的基础类,比如用作消息流转的Msg以及一些工具类 monitor-spring-boot-st

null 1 Jan 24, 2022
The common module is for the TenIO framework.

TenIO Common Module TenIO is an open-source project to create multiplayer online games that includes a java NIO (Non-blocking I/O) based server specif

Kong 1 Nov 24, 2021
about learning Spring Boot via examples. Spring Boot 教程、技术栈示例代码,快速简单上手教程。

Spring Boot 学习示例 Spring Boot 使用的各种示例,以最简单、最实用为标准,此开源项目中的每个示例都以最小依赖,最简单为标准,帮助初学者快速掌握 Spring Boot 各组件的使用。 Spring Boot 中文索引 | Spring Cloud学习示例代码 | Spring

纯洁的微笑 28.3k Jan 1, 2023
spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。另外写博客,用 OpenWrite。

推荐工具: 微信公众号 Markdown 编辑器 - OpenWrite:Markdown 微信编辑器是一款专业强大的微信公众平台在线编辑排版工具,提供手机预览功能,让用户在微信图文 、文章、内容排版、文本编辑、素材编辑上更加方便。 - 更多介绍 博客群发平台 一、支持泥瓦匠 Spring Boot

泥瓦匠BYSocket 15.2k Jan 5, 2023
Spring-Boot-Plus is a easy-to-use, high-speed, high-efficient,feature-rich, open source spring boot scaffolding

Everyone can develop projects independently, quickly and efficiently! What is spring-boot-plus? A easy-to-use, high-speed, high-efficient, feature-ric

geekidea 2.3k Dec 31, 2022
Two Spring-boot applications registering themselves to an spring-boot-admin-server application as separate clients for the purpose of monitoring and managing the clients

Spring-boot-admin implementation with 1 Server and 2 clients Creating a Server application to monitor and manage Spring boot applications (clients) un

null 6 Dec 6, 2022