Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add spring-boot grpc demo #110

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<module>spring-boot-demo-elasticsearch-rest-high-level-client</module>
<module>spring-boot-demo-https</module>
<module>spring-boot-demo-flyway</module>
<module>spring-boot-demo-grpc</module>
</modules>
<packaging>pom</packaging>

Expand Down
25 changes: 25 additions & 0 deletions spring-boot-demo-grpc/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
87 changes: 87 additions & 0 deletions spring-boot-demo-grpc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# spring-boot-demo-grpc

> 此 demo 主要演示了如何使用 Spring Boot 集成 RPC并配置开启tls/ssl

## 项目结构
根项目(spring-boot-demo-grpc)下有3个子模块:

- spring-boot-demo-grpc-server:GRPC服务端
- spring-boot-demo-grpc-protocol:包含原始proto文件,以及其转换的java代码
- spring-boot-demo-grpc-client : GRPC客户端

## 配置指南
### .proto生成java文件
1、定义好proto文件放在项目"src\main\proto"目录下 如:spring-boot-demo-grpc-protocol\src\main\proto

2、生成java代码
1. 直接在IDE里用proto插件运行compile生成
2. 直接下载[protobuf-window版](https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protoc-3.11.4-win64.zip) 然后执行```./protoc.exe --java_out=./ demo.proto```

### 证书生成:
如果没有证书(例如内部测试服务器),可以使用openssl生成证书:

[openssl下载](http://slproweb.com/download/Win64OpenSSL-1_1_1e.msi) 可以参考这里[配置](https://github.com/kiinlam/kiinlam.github.io/issues/11)

服务端:
```openssl req -x509 -nodes -subj "/CN=localhost/C=CN" -newkey rsa:4096 -sha256 -keyout server.key -out server.crt -days 3650```

客户端:
```openssl req -x509 -nodes -subj "/CN=localhost/C=CN" -newkey rsa:4096 -sha256 -keyout server.key -out server.crt -days 3650```

**请注意** 如果没有额外配置,这些证书不受任何应用程序的信任。 我们建议您使用受全球CA或您公司CA信任的证书。

最后分别放入server、client的resources/certificates/下

### spring-boot-demo-grpc-client: GRPC客户端
```yaml
server:
port: 8090
spring:
application:
name: demo-grpc-client
grpc:
client:
demo-grpc-server:
address: 'static://localhost:9090'
# 禁用传输图层安全 请勿在生产环境中这样做
#negotiationType: plaintext
# gRPC 默认使用 TLS 连接服务端 该配置启用传输图层安全
negotiationType: TLS
security:
#如果您信任的证书不在常规信任存储区, 或者您想要限制您信任的 证书。您可以使用以下属性
trustCertCollection: classpath:certificates/trusted-server.crt.list
#要指定证书对哪个名字有效:
authorityOverride: localhost
#如果需要双向证书认证配置如下属性
clientAuthEnabled: true
certificateChain: classpath:certificates/client.crt
privateKey: classpath:certificates/client.key
```

### spring-boot-demo-grpc-server: GRPC服务端
```yaml
spring:
application:
name: demo-grpc-server
grpc:
server:
port: 9090
# 开启TLS相关配置
security:
enabled: true
certificateChain: classpath:certificates/server.crt
privateKey: classpath:certificates/server.key
#指定受信任客户端证书 直接把client.crt复制到该文件即可
trustCertCollection: classpath:certificates/trusted-clients.crt.list
#REQUIRE:客户端证书必须通过认证 OPTIONAL:对客户端的证书进行身份验证,但不会强制这么做。
clientAuth: REQUIRE
```

### 运行
client、server直接运行起来之后访问http://localhost:8090/hello 出现Hi~说明你成功了

## 详细配置说明
请参考[文档](https://yidongnan.github.io/grpc-spring-boot-starter/zh-CN/index)

## 常见问题
请参考[文档](https://yidongnan.github.io/grpc-spring-boot-starter/en/trouble-shooting.html)
48 changes: 48 additions & 0 deletions spring-boot-demo-grpc/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.xkcoding</groupId>
<artifactId>spring-boot-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<artifactId>spring-boot-demo-grpc</artifactId>
<packaging>pom</packaging>

<modules>
<module>spring-boot-demo-grpc-server</module>
<module>spring-boot-demo-grpc-client</module>
<module>spring-boot-demo-grpc-protocol</module>
</modules>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<grpc.version>1.27.1</grpc.version>
<os-maven-plugin.version>1.6.2</os-maven-plugin.version>
<protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
<com.google.protobuf.protoc.version>3.11.0</com.google.protobuf.protoc.version>
<protoc-gen-grpc-java.version>1.27.1</protoc-gen-grpc-java.version>
<net-devh-grpc.version>2.7.0.RELEASE</net-devh-grpc.version>
<netty-tcnative-boringssl-static.version>2.0.25.Final</netty-tcnative-boringssl-static.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>${net-devh-grpc.version}</version>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>${net-devh-grpc.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

</project>
33 changes: 33 additions & 0 deletions spring-boot-demo-grpc/spring-boot-demo-grpc-client/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-boot-demo-grpc</artifactId>
<groupId>com.xkcoding</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-boot-demo-grpc-client</artifactId>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>com.xkcoding</groupId>
<artifactId>spring-boot-demo-grpc-protocol</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.xkcoding.grpc.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* @author dengliming
* @date 2020/3/29
*/
@SpringBootApplication
public class SpringBootDemoGrpcClientApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBootDemoGrpcClientApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.xkcoding.grpc.client.controller;

import com.xkcoding.grpc.client.service.GrpcClientService;
import com.xkcoding.grpc.protocol.DemoResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author dengliming
* @date 2020/3/29
*/
@RestController
public class GrpcClientController {

private final GrpcClientService grpcClientService;

public GrpcClientController(GrpcClientService grpcClientService) {
this.grpcClientService = grpcClientService;
}

@RequestMapping("/hello")
public String hello() {
DemoResponse rpcResponse = grpcClientService.hello();
return rpcResponse.getMsg();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.xkcoding.grpc.client.service;

import com.xkcoding.grpc.protocol.DemoRequest;
import com.xkcoding.grpc.protocol.DemoResponse;
import com.xkcoding.grpc.protocol.DemoServiceGrpc;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service;

/**
* @author dengliming
* @date 2020/3/29
*/
@Service
public class GrpcClientService {

@GrpcClient("demo-grpc-server")
private DemoServiceGrpc.DemoServiceBlockingStub demoServiceBlockingStub;

public DemoResponse hello() {
return demoServiceBlockingStub.hello(DemoRequest.newBuilder().build());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
server:
port: 8090
spring:
application:
name: demo-grpc-client
grpc:
client:
demo-grpc-server:
address: 'static://localhost:9090'
# 禁用传输图层安全 请勿在生产环境中这样做
#negotiationType: plaintext
# gRPC 默认使用 TLS 连接服务端 该配置启用传输图层安全
negotiationType: TLS
security:
#如果您信任的证书不在常规信任存储区, 或者您想要限制您信任的 证书。您可以使用以下属性
trustCertCollection: classpath:certificates/trusted-server.crt.list
#要指定证书对哪个名字有效:
authorityOverride: localhost
#如果需要双向证书认证配置如下属性
clientAuthEnabled: true
certificateChain: classpath:certificates/client.crt
privateKey: classpath:certificates/client.key

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFIzCCAwugAwIBAgIUBbeCJLNMSmJI4X2IHaOpz42GNZowDQYJKoZIhvcNAQEL
BQAwITESMBAGA1UEAwwJbG9jYWxob3N0MQswCQYDVQQGEwJDTjAeFw0yMDAzMjkw
NTE1MDhaFw0zMDAzMjcwNTE1MDhaMCExEjAQBgNVBAMMCWxvY2FsaG9zdDELMAkG
A1UEBhMCQ04wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDPGZ2P0qLb
qxGjt+AhIvAqnE1xIVESy05d9VUYqHCjp/UG3FMFA8YlXXeAjjW4yV6ZOSeAwgMV
DXX4vrQEiH1ZhDyXI4O8wuEvZG63oNWdpzbFCsXvXjZbVfUiaCvybjUzOBUxoNoT
E6YNQ+ELXizruC7NBcT7QfG1iZXbbYRArIJK9KXIS0rHKjiVNZR+8IEN7t0GfH7D
X2CmHmZzmPttLPFhcUfsJX1mNKGy/zFU+etka6BrV0gw4KwC7p8YpR2fXQfD3TxB
HTz9lXb0UvcKghaJDFDpMI4oUGGSqOgdGJvLBQ3SqvE4fDX+C+vGhaLgU1ut+Coh
PUWx1HMtsP7YQuK7/tSmNBdfQObfu9WgADOYx2oOITuA/ziVeOR3rkbA37p3lUhL
vRKfjywU/5tEsQlcdrEK0csO9tPcetqQjlOF8Jlb8VbsKtAC3KLUpPIjJRw5sbtL
r8SCm+aeTqpXtrT0sBVpsb8QBX8/RPHLU8H3UBNrmS5U++8lZ+Z1mQnfexWfPObx
N7M0MJZUKUQqdUTdUGgeV4JSQxLQByEntbuOKiS706VC6PV4C87xXw0qU0hshyip
jyAht31D9vc8eMkAklMqJ3IGFr65n+15O1D79NS3boxF1kLjvE50nlG30k2q3MXF
zTnfH5K7iSBjwVv6Cpt0f/jFgxxnqKRn4QIDAQABo1MwUTAdBgNVHQ4EFgQUpwe5
lEf4PzqvhKIFdbJQX3umNkQwHwYDVR0jBBgwFoAUpwe5lEf4PzqvhKIFdbJQX3um
NkQwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAivb7EBwXy1QD
hHAbE8w2b+7b3biGug8+aOo12O6+klahUwCqwBYM8ek+G2eO9r9++CO1+Zqu+TGF
34zJBxc23MHzdFMqUaPdhqopB/rL2cnberHyJLbShB5vYG+RnZ7O8pnloxKPNHNu
rFIQMlbHWzBe3jxTJye+4PEi2DqEdqbDu7F/ZWyIxGlJgzPvXn/IfMU/Nbn/lcpS
aZHI8rc0ZzaHeqbkp8O0BnrVdkcs3YXZeQLYw/huj1AjyBBW/lc+U3Dm7wze5/rm
wXTIUzJ5uS3Eg70DTvLAn1ux0CdJJbC5DoZsK+aKL6gEMYhIK1ysfD7g6GZB4ZII
TAHuhv4zRkuZWNHl2jZAI1Zcm4ElUKspPMkEeVz8Ir7LWbRSv/f7gnss2hEy0MK4
2aZXOmrNIajWHn9+ZESRAKCeZxxBs1cePIcrBDHBZkpt8gesevY9lx9JO14baZNK
POB+30C5BspEUXQOj8QzyyiBWBjGnhLelncDwyPjfcTCKXnr+qdmX63RqyvPgezF
C6O2Z1l38WT9KLQtX9qqlZPFakeMh+t4nXdkKn6qKPaubQWILQiuo0P9F2ANgdoZ
AeVYmpQkcJT+wKVIsYC9BASwiKvf2MGLYcVIZDG4/kfIsQU7J5dLFFNOweDHkhuc
2cWvvicGgDox34LQRs0GNcJnFlZl2Tg=
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
9a1pQp7WUIHq9TJ4CHNkQm68d+UUC1a26A==
-----END PRIVATE KEY-----
Loading