فهرست منبع

:four_leaf_clover: 用户注册,异步消息

nnkwrik 6 سال پیش
والد
کامیت
864fb6792b
24فایلهای تغییر یافته به همراه478 افزوده شده و 316 حذف شده
  1. 11 0
      auth-service/pom.xml
  2. 72 40
      auth-service/src/main/java/io/github/nnkwrik/authservice/controller/AuthController.java
  3. 14 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/dto/AuthDTO.java
  4. 15 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/dto/DetailAuthDTO.java
  5. 29 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/model/vo/AuthVo.java
  6. 23 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/mq/RegisterStreamSender.java
  7. 20 1
      auth-service/src/main/java/io/github/nnkwrik/authservice/token/TokenCreator.java
  8. 16 2
      auth-service/src/main/resources/application.yml
  9. 34 0
      common/pom.xml
  10. 0 16
      common/src/main/java/io/github/nnkwrik/common/dto/AuthDTO.java
  11. 18 120
      common/src/main/java/io/github/nnkwrik/common/dto/Response.java
  12. 23 0
      common/src/main/java/io/github/nnkwrik/common/mq/UserRegisterStream.java
  13. 1 1
      common/src/main/java/io/github/nnkwrik/common/token/RSAKeysReader.java
  14. 5 1
      common/src/main/java/io/github/nnkwrik/common/token/TokenSolver.java
  15. 35 0
      common/src/main/java/io/github/nnkwrik/common/util/JsonUtil.java
  16. 8 0
      dev/rabbitmq/start.sh
  17. 0 34
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/vo/ResponseVO.java
  18. 20 8
      user-service/pom.xml
  19. 2 4
      user-service/src/main/java/io/github/nnkwrik/userservice/UserServiceApplication.java
  20. 22 22
      user-service/src/main/java/io/github/nnkwrik/userservice/client/AuthClient.java
  21. 64 64
      user-service/src/main/java/io/github/nnkwrik/userservice/controller/UserController.java
  22. 0 3
      user-service/src/main/java/io/github/nnkwrik/userservice/model/User.java
  23. 33 0
      user-service/src/main/java/io/github/nnkwrik/userservice/mq/RegisterStreamReceiver.java
  24. 13 0
      user-service/src/main/resources/application.yml

+ 11 - 0
auth-service/pom.xml

@@ -66,6 +66,17 @@
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
+        </dependency>
+
+
 
 
     </dependencies>

+ 72 - 40
auth-service/src/main/java/io/github/nnkwrik/authservice/controller/AuthController.java

@@ -4,15 +4,21 @@ import cn.binarywang.wx.miniapp.api.WxMaUserService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import io.github.nnkwrik.authservice.config.WxMaConfiguration;
+import io.github.nnkwrik.authservice.dto.AuthDTO;
+import io.github.nnkwrik.authservice.dto.DetailAuthDTO;
+import io.github.nnkwrik.authservice.model.vo.AuthVo;
+import io.github.nnkwrik.authservice.mq.RegisterStreamSender;
 import io.github.nnkwrik.authservice.token.TokenCreator;
-import io.github.nnkwrik.common.dto.AuthDTO;
 import io.github.nnkwrik.common.dto.JWTUser;
 import io.github.nnkwrik.common.dto.Response;
+import io.github.nnkwrik.common.mq.UserRegisterStream;
+import io.github.nnkwrik.common.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.cloud.stream.annotation.EnableBinding;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
@@ -26,68 +32,94 @@ import java.util.Map;
  */
 @Slf4j
 @RestController
+@EnableBinding(UserRegisterStream.class)
 public class AuthController {
 
+
     @Autowired
-    public TokenCreator creator;
+    private TokenCreator creator;
 
-    @GetMapping("/test")
-    public String test() {
-        return "test is success";
-    }
 
-    @PostMapping("/login")
-    public Response login(@RequestBody AuthDTO authDTO) {
+    @Autowired
+    private RegisterStreamSender registerSender;
+
+//    @GetMapping("/test/{message}")
+//    public String test(@PathVariable String message) {
+//        registerSender.send(message);
+//        return "test is success";
+//    }
+
+
+    @PostMapping("/auth/loginByWeixin")
+    public Response loginByWeixin(@RequestBody AuthDTO authDTO) throws IOException {
+
         log.info("用户登录 : {}", authDTO);
         WxMaUserService wxUserService = WxMaConfiguration.getMaServices().getUserService();
 
         //验证用户登录凭证
         WxMaJscode2SessionResult sessionInfo = null;
         try {
-            sessionInfo = wxUserService.getSessionInfo(authDTO.getJsCode());
+            sessionInfo = wxUserService.getSessionInfo(authDTO.getCode());
         } catch (WxErrorException e) {
-            return Response.fail("凭证失效,登录失败");
+            String message = "jscode失效,登录失败";
+            log.info(message);
+            return Response.fail(Response.WRONG_JS_CODE, message);
         }
 
         //验证用户给出的userInfo是否正确
         String sessionKey = sessionInfo.getSessionKey();
         String openId = sessionInfo.getOpenid();
-        if (!wxUserService.checkUserInfo(sessionKey, authDTO.getRawData(), authDTO.getSignature())) {
+        DetailAuthDTO detail = authDTO.getDetail();
+        if (!wxUserService.checkUserInfo(sessionKey, detail.getRawData(), detail.getSignature())) {
             String message = "userInfo 和 session 中的不一致";
             log.info(message);
-            return Response.fail(message);
+            return Response.fail(Response.CHECK_USER_WITH_SESSION_FAIL, message);
         }
 
-        //构造JWT token
-        ObjectMapper mapper = new ObjectMapper();
-        Map<String, String> jsonMap = null;
-        try {
-            jsonMap = mapper.readValue(authDTO.getRawData(), new TypeReference<Map<String, String>>() {
-            });
-        } catch (IOException e) {
-            String message = "Json转Map失败";
-            log.info(message);
-            e.printStackTrace();
-            return Response.fail(message);
+        String userData = setOpenId4Data(detail.getRawData(), openId);
+        if (authDTO.getFirstLogin()) {
+            //异步调用user-service注册到数据库
+            registerSender.send(userData);
         }
 
-        JWTUser jwtUser = new JWTUser(openId,jsonMap.get("nickName"),jsonMap.get("avatarUrl"));
+        //构造JWT token
+        AuthVo vo = createToken(userData);
 
-        String token =  creator.create(jwtUser);
-        return Response.ok(token);
+        log.info("认证成功,用户信息 : {}", vo);
+        return Response.ok(vo);
+    }
+
+    /**
+     * 在原有的rawData中附上openId
+     *
+     * @param rawData
+     * @param openId
+     * @return
+     * @throws IOException
+     */
+    private String setOpenId4Data(String rawData, String openId) throws IOException {
+
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode node = (ObjectNode) mapper.readTree(rawData);
+        node.remove("openId");
+        node.put("openId", openId);
+        return node.toString();
+    }
+
+    /**
+     * 通过json用户信息构造vo
+     * @param userData
+     * @return
+     */
+    private AuthVo createToken(String userData) {
+        Map<String, String> rawData =
+                JsonUtil.fromJson(userData, new TypeReference<Map<String, String>>() {
+                });
+        String openId = rawData.get("openId");
+        String nickname = rawData.get("nickName");
+        String avatar = rawData.get("avatarUrl");
+        String token = creator.create(openId, nickname, avatar);
+        return new AuthVo(token, nickname, avatar);
     }
 
-//    @PostMapping("/generateJwt")
-//    public String generateJwt (@RequestBody JWTUser jwtUser){
-//        String token = TokenCreator.create(jwtUser);
-//        System.out.println(token);
-//        return token;
-//    }
-//
-//    @PostMapping("/solveJwt")
-//    public JWTUser generateJwt (@RequestBody String token){
-//        JWTUser user = TokenSolver.solve(token);
-//        System.out.println(user);
-//        return user;
-//    }
 }

+ 14 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/dto/AuthDTO.java

@@ -0,0 +1,14 @@
+package io.github.nnkwrik.authservice.dto;
+
+import lombok.Data;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/12 15:49
+ */
+@Data
+public class AuthDTO {
+    private String code;
+    private DetailAuthDTO detail;
+    private Boolean firstLogin;
+}

+ 15 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/dto/DetailAuthDTO.java

@@ -0,0 +1,15 @@
+package io.github.nnkwrik.authservice.dto;
+
+import lombok.Data;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/19 14:13
+ */
+@Data
+public class DetailAuthDTO {
+    public String signature;
+    public String rawData;
+    public String encryptedData;
+    public String iv;
+}

+ 29 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/model/vo/AuthVo.java

@@ -0,0 +1,29 @@
+package io.github.nnkwrik.authservice.model.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/19 14:28
+ */
+@Data
+@NoArgsConstructor
+public class AuthVo {
+    private String token;
+    private UserInfo userInfo;
+
+    public AuthVo(String token, String nickname, String avatar) {
+        this.token = token;
+        this.userInfo = new UserInfo(nickname, avatar);
+    }
+
+
+}
+@Data
+@AllArgsConstructor
+class UserInfo {
+    private String nickname;
+    private String avatar;
+}

+ 23 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/mq/RegisterStreamSender.java

@@ -0,0 +1,23 @@
+package io.github.nnkwrik.authservice.mq;
+
+import io.github.nnkwrik.common.mq.UserRegisterStream;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/19 21:36
+ */
+@Component
+@EnableBinding(UserRegisterStream.class)
+public class RegisterStreamSender {
+
+    @Autowired
+    private UserRegisterStream streamClient;
+
+    public void send(String userDate) {
+        streamClient.output().send(MessageBuilder.withPayload(userDate).build());
+    }
+}

+ 20 - 1
auth-service/src/main/java/io/github/nnkwrik/authservice/token/TokenCreator.java

@@ -27,6 +27,9 @@ public class TokenCreator {
     private String pvtFile;
 
     private RSAKeyProvider keyProvider = new RSAKeyProvider() {
+
+        RSAPrivateKey key;
+
         @Override
         public RSAPublicKey getPublicKeyById(String s) {
             return null;
@@ -34,7 +37,8 @@ public class TokenCreator {
 
         @Override
         public RSAPrivateKey getPrivateKey() {
-            return RSAKeysReader.readRsaPvt(pvtFile);
+            if (key == null) key = RSAKeysReader.readRsaPvt(pvtFile);
+            return key;
         }
 
         @Override
@@ -58,4 +62,19 @@ public class TokenCreator {
         return "Bearer " + token;
     }
 
+    public String create(String openId, String nickName, String avatarUrl) {
+        Algorithm algorithm = Algorithm.RSA256(keyProvider);
+        //一天后过期
+        Date expire = Date.from(Instant.now().plus(1, ChronoUnit.DAYS));
+
+        String token = JWT.create()
+                .withClaim("openId", openId)
+                .withClaim("nickName", nickName)
+                .withClaim("avatarUrl", avatarUrl)
+                .withExpiresAt(expire)
+                .sign(algorithm);
+
+        return "Bearer " + token;
+    }
+
 }

+ 16 - 2
auth-service/src/main/resources/application.yml

@@ -3,16 +3,30 @@ eureka:
     service-url:
       defaultZone: http://localhost:8801/eureka/
 
+
 spring:
   application:
     name: auth-service
   profiles:
     include: secret
+  rabbitmq:
+    host: localhost
+    port: 5672
+    username: guest
+    password: guest
+  cloud:
+    stream:
+      bindings:
+        register-output:
+          destination: register
+          content-type: application/json
+
 
 server:
   port: 8803
 
-
 jwt:
   pvt-key-file-name: RSA.key
-  pub-key-file-name: RSA.pub
+  pub-key-file-name: RSA.pub
+
+

+ 34 - 0
common/pom.xml

@@ -23,6 +23,7 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
+        <spring-cloud.version>Greenwich.M1</spring-cloud.version>
     </properties>
 
     <dependencies>
@@ -44,8 +45,30 @@
             <artifactId>java-jwt</artifactId>
             <version>3.4.1</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
+        </dependency>
+
     </dependencies>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <build>
         <plugins>
             <plugin>
@@ -55,5 +78,16 @@
         </plugins>
     </build>
 
+    <repositories>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
 
 </project>

+ 0 - 16
common/src/main/java/io/github/nnkwrik/common/dto/AuthDTO.java

@@ -1,16 +0,0 @@
-package io.github.nnkwrik.common.dto;
-
-import lombok.Data;
-
-/**
- * @author nnkwrik
- * @date 18/11/12 15:49
- */
-@Data
-public class AuthDTO {
-    private String jsCode;
-    private String signature;
-    private String rawData;
-//    private String encryptedData;
-//    private String iv;
-}

+ 18 - 120
common/src/main/java/io/github/nnkwrik/common/dto/Response.java

@@ -1,140 +1,38 @@
 package io.github.nnkwrik.common.dto;
 
+import lombok.Data;
+
 /**
  * @author nnkwrik
- * @date 18/11/11 16:42
+ * @date 18/11/14 21:07
  */
+@Data
 public class Response<T> {
-    /**
-     * 服务器响应数据
-     */
-    private T payload;
-
-    /**
-     * 请求是否成功
-     */
-    private boolean success;
-
-    /**
-     * 错误信息
-     */
-    private String msg;
 
-    /**
-     * 状态码
-     */
-    private int code = -1;
+    public static final int WRONG_JS_CODE = 3001;
+    public static final int CHECK_USER_WITH_SESSION_FAIL = 3002;
 
-    /**
-     * 服务器响应时间
-     */
-    private long timestamp;
+    private int errno;
+    private String errmsg;
+    private T data;
 
-    public Response() {
-        this.timestamp = System.currentTimeMillis() / 1000;
-    }
-
-    public Response(boolean success) {
-        this.timestamp = System.currentTimeMillis() / 1000;
-        this.success = success;
-    }
 
-    public Response(boolean success, T payload) {
-        this.timestamp = System.currentTimeMillis() / 1000;
-        this.success = success;
-        this.payload = payload;
+    public Response(T data) {
+        this.data = data;
     }
 
-    public Response(boolean success, T payload, int code) {
-        this.timestamp = System.currentTimeMillis() / 1000;
-        this.success = success;
-        this.payload = payload;
-        this.code = code;
+    public Response(int errno, String errmsg) {
+        this.errno = errno;
+        this.errmsg = errmsg;
     }
 
-    public Response(boolean success, String msg) {
-        this.timestamp = System.currentTimeMillis() / 1000;
-        this.success = success;
-        this.msg = msg;
-    }
-
-    public Response(boolean success, String msg, int code) {
-        this.timestamp = System.currentTimeMillis() / 1000;
-        this.success = success;
-        this.msg = msg;
-        this.code = code;
-    }
-
-    public T getPayload() {
-        return payload;
-    }
-
-    public void setPayload(T payload) {
-        this.payload = payload;
-    }
-
-    public boolean isSuccess() {
-        return success;
-    }
-
-    public void setSuccess(boolean success) {
-        this.success = success;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-
-    public int getCode() {
-        return code;
-    }
-
-    public void setCode(int code) {
-        this.code = code;
-    }
-
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    public void setTimestamp(long timestamp) {
-        this.timestamp = timestamp;
-    }
-
-    public static Response ok() {
-        return new Response(true);
-    }
-
-    public static <T> Response ok(T payload) {
-        return new Response(true, payload);
-    }
-
-    public static <T> Response ok(int code) {
-        return new Response(true, null, code);
-    }
-
-    public static <T> Response ok(T payload, int code) {
-        return new Response(true, payload, code);
-    }
-
-    public static Response fail() {
-        return new Response(false);
-    }
-
-    public static Response fail(String msg) {
-        return new Response(false, msg);
-    }
 
-    public static Response fail(int code) {
-        return new Response(false, null, code);
+    public static <T> Response ok(T data) {
+        return new Response(data);
     }
 
-    public static Response fail(int code, String msg) {
-        return new Response(false, msg, code);
+    public static Response fail(int errno, String errmsg) {
+        return new Response(errno, errmsg);
     }
 
 }

+ 23 - 0
common/src/main/java/io/github/nnkwrik/common/mq/UserRegisterStream.java

@@ -0,0 +1,23 @@
+package io.github.nnkwrik.common.mq;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/19 16:19
+ */
+public interface UserRegisterStream {
+
+    String INPUT = "register-input";
+    String OUTPUT = "register-output";
+
+    @Input(UserRegisterStream.INPUT)
+    SubscribableChannel input();
+
+    @Output(UserRegisterStream.OUTPUT)
+    MessageChannel output();
+
+}

+ 1 - 1
common/src/main/java/io/github/nnkwrik/common/token/RSAKeysReader.java

@@ -72,7 +72,7 @@ public class RSAKeysReader {
         String data = "";
         try {
             File file = new ClassPathResource(fileName).getFile();
-            log.info("从[{}]试图读取秘钥文件",file.getPath());
+            log.info("试图读取秘钥文件, 文件路径 : [{}]",file.getPath());
             data = new String(Files.readAllBytes(file.toPath()));
         } catch (IOException e) {
             log.info("文件读取失败");

+ 5 - 1
common/src/main/java/io/github/nnkwrik/common/token/TokenSolver.java

@@ -22,9 +22,13 @@ public class TokenSolver {
     private String pubFile;
 
     private RSAKeyProvider keyProvider = new RSAKeyProvider() {
+
+        RSAPublicKey key;
+
         @Override
         public RSAPublicKey getPublicKeyById(String s) {
-            return RSAKeysReader.readRsaPub(pubFile);
+            if (key == null) key = RSAKeysReader.readRsaPub(pubFile);
+            return key;
         }
 
         @Override

+ 35 - 0
common/src/main/java/io/github/nnkwrik/common/util/JsonUtil.java

@@ -0,0 +1,35 @@
+package io.github.nnkwrik.common.util;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/19 16:54
+ */
+public class JsonUtil {
+    private static ObjectMapper mapper = new ObjectMapper();
+
+    public static Map<String, String> fromJson(String rawData, TypeReference typeReference) {
+        try {
+            return mapper.readValue(rawData, typeReference);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static <T> T fromJson(String rawData, Class<T> classType) {
+        try {
+            return mapper.readValue(rawData, classType);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 8 - 0
dev/rabbitmq/start.sh

@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+#default username/password = guest/guest
+# 15672 浏览器能访问的管理界面
+# 5672 在项目中配置这个端口
+docker stop fangxianyu-rabbitmq
+docker rm fangxianyu-rabbitmq
+docker run -d --name fangxianyu-rabbitmq --hostname my-rabbit-mq -p 5672:5672 -p 15672:15672 rabbitmq:3.7.8-management

+ 0 - 34
goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/vo/ResponseVO.java

@@ -1,34 +0,0 @@
-package io.github.nnkwrik.goodsservice.model.vo;
-
-import lombok.Data;
-
-/**
- * @author nnkwrik
- * @date 18/11/14 21:07
- */
-@Data
-public class ResponseVO<T> {
-    private int errno;
-    private String errmsg;
-    private T data;
-
-
-    public ResponseVO(T data) {
-        this.data = data;
-    }
-
-    public ResponseVO(int errno, String errmsg) {
-        this.errno = errno;
-        this.errmsg = errmsg;
-    }
-
-
-    public static <T> ResponseVO ok(T data) {
-        return new ResponseVO(data);
-    }
-
-    public static ResponseVO fail(int errno, String errmsg) {
-        return new ResponseVO(errno, errmsg);
-    }
-
-}

+ 20 - 8
user-service/pom.xml

@@ -26,15 +26,15 @@
     </properties>
 
     <dependencies>
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.cloud</groupId>-->
+            <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
+        <!--</dependency>-->
 
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-openfeign</artifactId>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.cloud</groupId>-->
+            <!--<artifactId>spring-cloud-starter-openfeign</artifactId>-->
+        <!--</dependency>-->
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -47,6 +47,7 @@
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
 
+
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-miniapp</artifactId>
@@ -81,6 +82,17 @@
             <artifactId>common</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-amqp</artifactId>-->
+        <!--</dependency>-->
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
+        </dependency>
+
     </dependencies>
 
     <dependencyManagement>

+ 2 - 4
user-service/src/main/java/io/github/nnkwrik/userservice/UserServiceApplication.java

@@ -2,12 +2,10 @@ package io.github.nnkwrik.userservice;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-import org.springframework.cloud.openfeign.EnableFeignClients;
 
 @SpringBootApplication
-@EnableDiscoveryClient
-@EnableFeignClients
+//@EnableDiscoveryClient
+//@EnableFeignClients
 public class UserServiceApplication {
 
     public static void main(String[] args) {

+ 22 - 22
user-service/src/main/java/io/github/nnkwrik/userservice/client/AuthClient.java

@@ -1,22 +1,22 @@
-package io.github.nnkwrik.userservice.client;
-
-import io.github.nnkwrik.common.dto.AuthDTO;
-import io.github.nnkwrik.userservice.util.Response;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-/**
- * @author nnkwrik
- * @date 18/11/12 17:44
- */
-@FeignClient(name = "auth-service")
-public interface AuthClient {
-
-    @GetMapping("/test")
-    String test();
-
-    @PostMapping("/login")
-    Response login(@RequestBody AuthDTO authDTO);
-}
+//package io.github.nnkwrik.userservice.client;
+//
+//import io.github.nnkwrik.common.dto.AuthDTO;
+//import io.github.nnkwrik.userservice.util.Response;
+//import org.springframework.cloud.openfeign.FeignClient;
+//import org.springframework.web.bind.annotation.GetMapping;
+//import org.springframework.web.bind.annotation.PostMapping;
+//import org.springframework.web.bind.annotation.RequestBody;
+//
+///**
+// * @author nnkwrik
+// * @date 18/11/12 17:44
+// */
+//@FeignClient(name = "auth-service")
+//public interface AuthClient {
+//
+//    @GetMapping("/test")
+//    String test();
+//
+//    @PostMapping("/login")
+//    Response login(@RequestBody AuthDTO authDTO);
+//}

+ 64 - 64
user-service/src/main/java/io/github/nnkwrik/userservice/controller/UserController.java

@@ -1,64 +1,64 @@
-package io.github.nnkwrik.userservice.controller;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.github.nnkwrik.common.dto.AuthDTO;
-import io.github.nnkwrik.userservice.client.AuthClient;
-import io.github.nnkwrik.userservice.model.User;
-import io.github.nnkwrik.userservice.service.UserService;
-import io.github.nnkwrik.userservice.util.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.io.IOException;
-
-/**
- * @author nnkwrik
- * @date 18/11/10 21:51
- */
-@RestController
-public class UserController {
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    @Autowired
-    private UserService userService;
-
-    @Autowired
-    private AuthClient authClient;
-
-    @GetMapping("/test")
-    public String test(){
-        return authClient.test();
-    }
-
-
-    @PostMapping("/register")
-    public Response register(@RequestBody AuthDTO authDTO) {
-
-        Response response = authClient.login(authDTO);
-        if (!response.isSuccess()) {
-            log.info("认证失败,原因 :{}", response.getMsg());
-            return response;
-        }
-
-        //rawData转User
-        ObjectMapper mapper = new ObjectMapper();
-        User user = null;
-        try {
-            user = mapper.readValue(authDTO.getRawData(), User.class);
-        } catch (IOException e) {
-            log.info("rawData转User失败 : rawData = {}", authDTO.getRawData());
-            e.printStackTrace();
-            return Response.fail("rawData转User失败 ");
-        }
-        userService.register(user);
-
-        log.info("新用户:用户名 = [{}],城市 = [{}]", user.getNickName(), user.getCity());
-        return response;
-    }
-
-
-
-}
+//package io.github.nnkwrik.userservice.controller;
+//
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import io.github.nnkwrik.common.dto.AuthDTO;
+//import io.github.nnkwrik.userservice.client.AuthClient;
+//import io.github.nnkwrik.userservice.model.User;
+//import io.github.nnkwrik.userservice.service.UserService;
+//import io.github.nnkwrik.userservice.util.Response;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//
+//import java.io.IOException;
+//
+///**
+// * @author nnkwrik
+// * @date 18/11/10 21:51
+// */
+//@RestController
+//public class UserController {
+//
+//    private final Logger log = LoggerFactory.getLogger(this.getClass());
+//
+//    @Autowired
+//    private UserService userService;
+//
+//    @Autowired
+//    private AuthClient authClient;
+//
+//    @GetMapping("/test")
+//    public String test(){
+//        return authClient.test();
+//    }
+//
+//
+//    @PostMapping("/register")
+//    public Response register(@RequestBody AuthDTO authDTO) {
+//
+//        Response response = authClient.login(authDTO);
+//        if (!response.isSuccess()) {
+//            log.info("认证失败,原因 :{}", response.getMsg());
+//            return response;
+//        }
+//
+//        //rawData转User
+//        ObjectMapper mapper = new ObjectMapper();
+//        User user = null;
+//        try {
+//            user = mapper.readValue(authDTO.getRawData(), User.class);
+//        } catch (IOException e) {
+//            log.info("rawData转User失败 : rawData = {}", authDTO.getRawData());
+//            e.printStackTrace();
+//            return Response.fail("rawData转User失败 ");
+//        }
+//        userService.register(user);
+//
+//        log.info("新用户:用户名 = [{}],城市 = [{}]", user.getNickName(), user.getCity());
+//        return response;
+//    }
+//
+//
+//
+//}

+ 0 - 3
user-service/src/main/java/io/github/nnkwrik/userservice/model/User.java

@@ -13,11 +13,8 @@ import javax.validation.constraints.NotNull;
 public class User {
     private Integer id;
     private String openId;
-    @NotNull
     private String nickName;
-    @NotNull
     private String avatarUrl;
-    @NotNull
     private Integer gender;
     private String language;
     private String city;

+ 33 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/mq/RegisterStreamReceiver.java

@@ -0,0 +1,33 @@
+package io.github.nnkwrik.userservice.mq;
+
+import io.github.nnkwrik.common.mq.UserRegisterStream;
+import io.github.nnkwrik.common.util.JsonUtil;
+import io.github.nnkwrik.userservice.model.User;
+import io.github.nnkwrik.userservice.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/19 16:20
+ */
+@Slf4j
+@Component
+@EnableBinding(UserRegisterStream.class)
+public class RegisterStreamReceiver {
+
+    @Autowired
+    private UserService userService;
+
+    @StreamListener(target = UserRegisterStream.INPUT)
+    public void receive(String userData){
+        User user = JsonUtil.fromJson(userData, User.class);
+
+        log.info("从 [ auth-service ] 收到 [ 用户注册 ]的消息");
+        log.info("新用户:用户名 = [{}],城市 = [{}]", user.getNickName(), user.getCity());
+        userService.register(user);
+    }
+}

+ 13 - 0
user-service/src/main/resources/application.yml

@@ -14,5 +14,18 @@ spring:
     username: root
     password: 1234
     driver-class-name: com.mysql.cj.jdbc.Driver
+  rabbitmq:
+    host: localhost
+    port: 5672
+    username: guest
+    password: guest
+  cloud:
+    stream:
+      bindings:
+        register-input:
+          destination: register
+          group: registerGroup
+
+
 server:
   port: 8802