Skip to content

Commit c450609

Browse files
committed
feat(protobuf): gRPC inter-service communication between user-service and identity-service
1 parent b375be7 commit c450609

File tree

20 files changed

+336
-68
lines changed

20 files changed

+336
-68
lines changed

identity-service/pom.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,33 @@
9292
<version>1.0-SNAPSHOT</version>
9393
<scope>compile</scope>
9494
</dependency>
95+
96+
<dependency>
97+
<groupId>com.blubin</groupId>
98+
<artifactId>protobuf</artifactId>
99+
<version>1.0-SNAPSHOT</version>
100+
<scope>compile</scope>
101+
</dependency>
102+
103+
<dependency>
104+
<groupId>net.devh</groupId>
105+
<artifactId>grpc-spring-boot-starter</artifactId>
106+
</dependency>
107+
108+
<dependency>
109+
<groupId>com.google.protobuf</groupId>
110+
<artifactId>protobuf-java</artifactId>
111+
</dependency>
112+
113+
<dependency>
114+
<groupId>io.grpc</groupId>
115+
<artifactId>grpc-stub</artifactId>
116+
</dependency>
117+
118+
<dependency>
119+
<groupId>io.grpc</groupId>
120+
<artifactId>grpc-protobuf</artifactId>
121+
</dependency>
95122
</dependencies>
96123

97124
<build>

identity-service/src/main/java/com/blubin/identityservice/config/OAuth2LoginSuccessHandler.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.blubin.identityservice.config;
2-
32
import com.blubin.identityservice.model.SiteUser;
3+
import com.blubin.identityservice.repository.SiteUserRepository;
4+
import com.blubin.identityservice.service.GrpcUserService;
5+
import com.blubin.identityservice.service.SiteUserService;
46
import com.blubin.identityservice.utils.JwtUtils;
7+
import com.blubin.proto.service.UserProfileRequest;
58
import jakarta.servlet.http.Cookie;
69
import jakarta.servlet.http.HttpServletRequest;
710
import jakarta.servlet.http.HttpServletResponse;
11+
import org.springframework.beans.factory.annotation.Autowired;
812
import org.springframework.security.core.Authentication;
913
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
1014
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
@@ -13,10 +17,17 @@
1317
import java.io.IOException;
1418
import java.net.URLEncoder;
1519
import java.nio.charset.StandardCharsets;
20+
1621
@Component
1722
public class OAuth2LoginSuccessHandler implements AuthenticationSuccessHandler {
1823
private final JwtUtils jwtUtils;
1924

25+
@Autowired
26+
private GrpcUserService grpcUserService;
27+
28+
@Autowired
29+
private SiteUserRepository siteUserRepository;
30+
2031
public OAuth2LoginSuccessHandler(JwtUtils jwtUtils) {
2132
this.jwtUtils = jwtUtils;
2233
}
@@ -30,9 +41,14 @@ public void onAuthenticationSuccess(HttpServletRequest request,
3041
String email = oidcUser.getEmail();
3142
String name = oidcUser.getAttribute("name");
3243

33-
SiteUser siteUser = new SiteUser();
34-
siteUser.setEmailAddress(email);
35-
siteUser.setUserName(name);
44+
45+
SiteUser siteUser = siteUserRepository.findByEmailAddress(email)
46+
.orElseGet(() -> {
47+
SiteUser newUser = new SiteUser();
48+
newUser.setEmailAddress(email);
49+
newUser.setUserName(name);
50+
return siteUserRepository.save(newUser);
51+
});
3652

3753
String token = jwtUtils.generateJwtToken(siteUser);
3854

@@ -46,6 +62,10 @@ public void onAuthenticationSuccess(HttpServletRequest request,
4662
cookie.setAttribute("SameSite", "Lax");
4763
response.addCookie(cookie);
4864

65+
String avatarUrl = oidcUser.getAttribute("picture");
66+
67+
grpcUserService.createUserProfile(siteUser, avatarUrl, name);
68+
4969
response.sendRedirect("/users");
5070
}
5171
}

identity-service/src/main/java/com/blubin/identityservice/controller/UserController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
package com.blubin.identityservice.controller;
2-
32
import com.blubin.identityservice.model.SiteUser;
43
import com.blubin.identityservice.service.SiteUserService;
54
import com.blubin.identityservice.viewmodel.SiteUserRequestVM;

identity-service/src/main/java/com/blubin/identityservice/model/SiteUser.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
import jakarta.validation.constraints.Size;
66
import lombok.Getter;
77
import lombok.Setter;
8-
import org.hibernate.annotations.ColumnDefault;
8+
import org.hibernate.annotations.CreationTimestamp;
99
import org.springframework.security.core.GrantedAuthority;
1010
import org.springframework.security.core.authority.SimpleGrantedAuthority;
1111
import org.springframework.security.core.userdetails.UserDetails;
1212

13-
import java.time.Instant;
13+
import java.time.LocalDateTime;
14+
import java.time.temporal.ChronoUnit;
1415
import java.util.Collection;
1516
import java.util.List;
1617
import java.util.UUID;
@@ -49,9 +50,9 @@ public class SiteUser implements UserDetails {
4950
@Column(name = "role",nullable = false)
5051
private UserRole role = UserRole.USER;
5152

52-
@ColumnDefault("CURRENT_TIMESTAMP")
53-
@Column(name = "created_at")
54-
private Instant createdAt;
53+
@CreationTimestamp
54+
@Column(name = "created_at", updatable = false, nullable = false)
55+
private LocalDateTime createdAt;
5556

5657
@Override
5758
public Collection<? extends GrantedAuthority> getAuthorities() {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.blubin.identityservice.service;
2+
3+
import com.blubin.identityservice.model.SiteUser;
4+
import com.blubin.proto.service.UserProfileRequest;
5+
import com.blubin.proto.service.UserProfileServiceGrpc;
6+
import net.devh.boot.grpc.client.inject.GrpcClient;
7+
import org.springframework.stereotype.Service;
8+
9+
@Service
10+
public class GrpcUserService {
11+
@GrpcClient("user-service")
12+
private UserProfileServiceGrpc.UserProfileServiceBlockingStub userProfileStub;
13+
14+
public void createUserProfile(SiteUser siteUser, String avatarUrl, String name) {
15+
UserProfileRequest request = UserProfileRequest.newBuilder()
16+
.setUserName(name)
17+
.setEmail(siteUser.getEmailAddress())
18+
.setUserId(siteUser.getId().toString())
19+
.setProfileAvatars(avatarUrl)
20+
.build();
21+
22+
userProfileStub.createUserProfile(request);
23+
}
24+
}

identity-service/src/main/resources/application.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
server:
22
port: 18081
33

4+
grpc:
5+
client:
6+
user-service:
7+
address: "static://localhost:19090"
8+
negotiationType: plaintext
9+
410
spring:
511
application:
612
name: identity-service
@@ -14,6 +20,10 @@ spring:
1420
hibernate:
1521
ddl-auto: update
1622
show-sql: true
23+
properties:
24+
hibernate:
25+
jdbc:
26+
time_zone=Asia/Ho_Chi_Minh:
1727
# security:
1828
# oauth2:
1929
# client:

pom.xml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
<modules>
1313
<module>common-service</module>
14+
<module>protobuf</module>
1415
<module>identity-service</module>
1516
<module>user-service</module>
1617
<module>product-service</module>
@@ -45,6 +46,12 @@
4546
<spring-cloud.version>2023.0.3</spring-cloud.version>
4647
<jwt-version>0.9.1</jwt-version>
4748
<jwt-ipml>0.11.5</jwt-ipml>
49+
<protobuf-java>3.24.1</protobuf-java>
50+
<io.github.lognet>5.1.5</io.github.lognet>
51+
<grpc-protobuf>1.70.0</grpc-protobuf>
52+
<grpc-stub>1.54.0</grpc-stub>
53+
<grpc-netty-shaded>1.54.0</grpc-netty-shaded>
54+
<grpc-spring-boot-starter>2.15.0.RELEASE</grpc-spring-boot-starter>
4855
</properties>
4956
<dependencyManagement>
5057
<dependencies>
@@ -145,6 +152,36 @@
145152
<artifactId>jjwt-api</artifactId>
146153
<version>${jwt-ipml}</version>
147154
</dependency>
155+
<dependency>
156+
<groupId>com.google.protobuf</groupId>
157+
<artifactId>protobuf-java</artifactId>
158+
<version>${protobuf-java}</version>
159+
</dependency>
160+
<dependency>
161+
<groupId>io.github.lognet</groupId>
162+
<artifactId>grpc-spring-boot-starter</artifactId>
163+
<version>${io.github.lognet}</version>
164+
</dependency>
165+
<dependency>
166+
<groupId>io.grpc</groupId>
167+
<artifactId>grpc-protobuf</artifactId>
168+
<version>${grpc-protobuf}</version>
169+
</dependency>
170+
<dependency>
171+
<groupId>io.grpc</groupId>
172+
<artifactId>grpc-stub</artifactId>
173+
<version>${grpc-stub}</version>
174+
</dependency>
175+
<dependency>
176+
<groupId>io.grpc</groupId>
177+
<artifactId>grpc-netty-shaded</artifactId>
178+
<version>${grpc-netty-shaded}</version>
179+
</dependency>
180+
<dependency>
181+
<groupId>net.devh</groupId>
182+
<artifactId>grpc-spring-boot-starter</artifactId>
183+
<version>${grpc-spring-boot-starter}</version>
184+
</dependency>
148185
</dependencies>
149186
</dependencyManagement>
150187
<dependencies>

protobuf/src/main/proto/common/testing.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
syntax = "proto3";
22

3-
package com.blubin.proto;
3+
package com.blubin.proto.common;
44

55
option java_multiple_files = true;
6-
option java_package = "com.blubin.proto";
6+
option java_package = "com.blubin.proto.common";
77

88
service TestService {
99
rpc testing(TestingRequest) returns (TestingResponse) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
syntax = "proto3";
2+
3+
package com.blubin.proto.service;
4+
5+
option java_multiple_files = true;
6+
option java_package = "com.blubin.proto.service";
7+
8+
message UserProfileRequest {
9+
string userName = 1;
10+
string email = 2;
11+
string profileAvatars = 3;
12+
string userId = 4;
13+
}
14+
15+
message UserProfileResponse {
16+
string userName = 1;
17+
string userId = 2;
18+
string profileAvatars = 3;
19+
}
20+
21+
service UserProfileService {
22+
rpc CreateUserProfile (UserProfileRequest) returns (UserProfileResponse);
23+
}

user-service/pom.xml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,28 @@
5656
<version>${revision}</version>
5757
<scope>compile</scope>
5858
</dependency>
59-
60-
59+
<dependency>
60+
<groupId>net.devh</groupId>
61+
<artifactId>grpc-spring-boot-starter</artifactId>
62+
</dependency>
63+
<dependency>
64+
<groupId>com.google.protobuf</groupId>
65+
<artifactId>protobuf-java</artifactId>
66+
</dependency>
67+
<dependency>
68+
<groupId>io.grpc</groupId>
69+
<artifactId>grpc-stub</artifactId>
70+
</dependency>
71+
<dependency>
72+
<groupId>io.grpc</groupId>
73+
<artifactId>grpc-protobuf</artifactId>
74+
</dependency>
75+
<dependency>
76+
<groupId>com.blubin</groupId>
77+
<artifactId>protobuf</artifactId>
78+
<version>1.0-SNAPSHOT</version>
79+
<scope>compile</scope>
80+
</dependency>
6181
</dependencies>
6282

6383
<build>

0 commit comments

Comments
 (0)