瀏覽代碼

update dataloader

remy.liu 4 年之前
父節點
當前提交
4bb7cc39b3
共有 24 個文件被更改,包括 124 次插入28 次删除
  1. 1 1
      base-module/src/main/java/com/remy/base/entity/BaseEntity.java
  2. 7 0
      common-module/pom.xml
  3. 1 1
      common-module/src/main/java/com/remy/common/helper/BeanHelper.java
  4. 4 0
      common-module/src/main/java/com/remy/common/module/UserDTO.java
  5. 10 1
      goods-service/src/main/java/com/remy/goods/controller/GoodsServiceController.java
  6. 2 0
      goods-service/src/main/java/com/remy/goods/dao/GoodsDAO.java
  7. 1 1
      goods-service/src/main/java/com/remy/goods/entity/Goods.java
  8. 2 0
      goods-service/src/main/java/com/remy/goods/service/GoodsService.java
  9. 5 0
      goods-service/src/main/java/com/remy/goods/service/impl/GoodsServiceImpl.java
  10. 30 12
      graphql-api/src/main/java/com/remy/graphql/builder/GraphqlContextBuilder.java
  11. 10 1
      graphql-api/src/main/java/com/remy/graphql/resolvers/dataloader/UserDataLoaderResolver.java
  12. 1 1
      graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/GoodsMutation.java
  13. 1 1
      graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/OrderMutation.java
  14. 1 1
      graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/UserMutation.java
  15. 4 0
      graphql-api/src/main/resources/graphqls/user.graphqls
  16. 5 0
      order-service/src/main/java/com/remy/order/controller/OrderController.java
  17. 1 1
      order-service/src/main/java/com/remy/order/entity/Order.java
  18. 6 0
      pom.xml
  19. 14 4
      user-service/src/main/java/com/remy/user/controller/UserController.java
  20. 5 1
      user-service/src/main/java/com/remy/user/dao/UserDAO.java
  21. 6 2
      user-service/src/main/java/com/remy/user/entity/User.java
  22. 2 0
      user-service/src/main/java/com/remy/user/service/UserService.java
  23. 5 0
      user-service/src/main/java/com/remy/user/service/impl/UserServiceImpl.java
  24. 二進制
      初识GraphQL.pptx

+ 1 - 1
base-module/src/main/java/com/remy/common/entity/BaseEntity.java → base-module/src/main/java/com/remy/base/entity/BaseEntity.java

@@ -1,4 +1,4 @@
-package com.remy.common.entity;
+package com.remy.base.entity;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 7 - 0
common-module/pom.xml

@@ -16,4 +16,11 @@
         <maven.compiler.target>8</maven.compiler.target>
     </properties>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+    </dependencies>
+
 </project>

+ 1 - 1
graphql-api/src/main/java/com/remy/graphql/helper/BeanHelper.java → common-module/src/main/java/com/remy/common/helper/BeanHelper.java

@@ -1,4 +1,4 @@
-package com.remy.graphql.helper;
+package com.remy.common.helper;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.type.TypeReference;

+ 4 - 0
common-module/src/main/java/com/remy/common/module/UserDTO.java

@@ -34,4 +34,8 @@ public class UserDTO extends BaseDTO {
     private List<String> addresses;
 
     private List<OrderDTO> orders;
+
+//    private List<UserDTO> attentions;
+
+//    private List<UserDTO> attentionIds;
 }

+ 10 - 1
goods-service/src/main/java/com/remy/goods/controller/GoodsServiceController.java

@@ -2,14 +2,15 @@ package com.remy.goods.controller;
 
 import com.remy.goods.entity.Goods;
 import com.remy.goods.service.GoodsService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.UUID;
 
 @RestController
+@Slf4j
 @RequestMapping("goods")
 public class GoodsServiceController {
 
@@ -23,9 +24,17 @@ public class GoodsServiceController {
 
     @RequestMapping("{serialNo}")
     public Goods findBySerialNo(@PathVariable("serialNo") String serialNo) {
+        log.info("query goods by serialNo: {}", serialNo);
         return goodsService.findBySerialNo(serialNo);
     }
 
+    @RequestMapping("query")
+    public List<Goods> findBySerialNo(@RequestParam("serialNos") List<String> serialNos) {
+        List<Goods> goods = goodsService.findAllByGoodsSerialNos(serialNos);
+        log.info("goods size: {}", goods.size());
+        return goods;
+    }
+
     @PostMapping()
     public Goods save(@RequestBody Goods goods) {
         goods.setSerialNo(RandomStringUtils.randomAlphanumeric(8));

+ 2 - 0
goods-service/src/main/java/com/remy/goods/dao/GoodsDAO.java

@@ -12,4 +12,6 @@ public interface GoodsDAO extends JpaRepository<Goods, Id> {
     List<Goods> findGoodsByNameLike(String name);
 
     Goods findGoodsBySerialNo(String serialNo);
+
+    List<Goods> findGoodsBySerialNoIn(List<String> serialNos);
 }

+ 1 - 1
goods-service/src/main/java/com/remy/goods/entity/Goods.java

@@ -1,6 +1,6 @@
 package com.remy.goods.entity;
 
-import com.remy.common.entity.BaseEntity;
+import com.remy.base.entity.BaseEntity;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;

+ 2 - 0
goods-service/src/main/java/com/remy/goods/service/GoodsService.java

@@ -11,4 +11,6 @@ public interface GoodsService {
     Goods findBySerialNo(String serialNo);
 
     Goods save(Goods goods);
+
+    List<Goods> findAllByGoodsSerialNos(List<String> serialNos);
 }

+ 5 - 0
goods-service/src/main/java/com/remy/goods/service/impl/GoodsServiceImpl.java

@@ -34,4 +34,9 @@ public class GoodsServiceImpl implements GoodsService {
     public Goods save(Goods goods) {
         return goodsDAO.save(goods);
     }
+
+    @Override
+    public List<Goods> findAllByGoodsSerialNos(List<String> serialNos) {
+        return goodsDAO.findGoodsBySerialNoIn(serialNos);
+    }
 }

+ 30 - 12
graphql-api/src/main/java/com/remy/graphql/builder/GraphqlContextBuilder.java

@@ -9,6 +9,7 @@ import graphql.kickstart.execution.context.GraphQLContext;
 import graphql.kickstart.servlet.context.DefaultGraphQLServletContext;
 import graphql.kickstart.servlet.context.DefaultGraphQLWebSocketContext;
 import graphql.kickstart.servlet.context.GraphQLServletContextBuilder;
+import org.apache.commons.lang3.StringUtils;
 import org.dataloader.DataLoader;
 import org.dataloader.DataLoaderRegistry;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -60,33 +61,39 @@ public class GraphqlContextBuilder implements GraphQLServletContextBuilder {
         dataLoaderRegistry.register("userDataLoader", userDataLoader());
         dataLoaderRegistry.register("orderGoodsDataLoader", orderGoodsDataLoader());
         dataLoaderRegistry.register("orderUserDataLoader", orderUserDataLoader());
+//        dataLoaderRegistry.register("userAttentionsDataLoader", userAttentionsDataLoader());
         return dataLoaderRegistry;
     }
 
     private DataLoader<String, GoodsDTO> goodsDataLoader() {
-        RestTemplate restTemplate = new RestTemplate();
         return new DataLoader<>(
                 goodsSerialNos -> supplyAsync(
-                        () -> goodsSerialNos.stream().map(goodsSerialNo -> restTemplate.getForObject(
-                                apiEnv.getGoodsEndpoint() + goodsSerialNo, GoodsDTO.class))
-                                .collect(Collectors.toList())));
+                        () -> new RestTemplate().exchange(
+                                apiEnv.getGoodsEndpoint() + "query?serialNos={goodsSerialNos}",
+                                HttpMethod.GET,
+                                new HttpEntity(null),
+                                new ParameterizedTypeReference<List<GoodsDTO>>() {
+                                }, StringUtils.join(goodsSerialNos, ",")).getBody()
+                ));
     }
 
     private DataLoader<Long, UserDTO> userDataLoader() {
-        RestTemplate restTemplate = new RestTemplate();
         return new DataLoader<>(
                 userIDs -> supplyAsync(
-                        () -> userIDs.stream().map(userID -> restTemplate.getForObject(
-                                apiEnv.getUsersEndpoint() + userID, UserDTO.class))
-                                .collect(Collectors.toList())));
+                        () -> new RestTemplate().exchange(
+                                apiEnv.getUsersEndpoint()+ "queryByIds?userIds={userIDs}",
+                                HttpMethod.GET,
+                                new HttpEntity(null),
+                                new ParameterizedTypeReference<List<UserDTO>>() {
+                                }, StringUtils.join(userIDs, ",")).getBody()
+                ));
     }
 
     private DataLoader<String, List<OrderDTO>> orderGoodsDataLoader() {
-        RestTemplate restTemplate = new RestTemplate();
         return new DataLoader<>(
                 goodsSerialNos -> supplyAsync(
                         () -> goodsSerialNos.stream().map(goodsSerialNo ->
-                                restTemplate.exchange(
+                                new RestTemplate().exchange(
                                         apiEnv.getOrdersEndpoint() + "query?goodsSerialNo={goodsSerialNo}",
                                         HttpMethod.GET,
                                         new HttpEntity(null),
@@ -96,11 +103,10 @@ public class GraphqlContextBuilder implements GraphQLServletContextBuilder {
     }
 
     private DataLoader<Long, List<OrderDTO>> orderUserDataLoader() {
-        RestTemplate restTemplate = new RestTemplate();
         return new DataLoader<>(
                 userIDs -> supplyAsync(
                         () -> userIDs.stream().map(userID ->
-                                restTemplate.exchange(
+                                new RestTemplate().exchange(
                                         apiEnv.getOrdersEndpoint() + "query?userID={userID}",
                                         HttpMethod.GET,
                                         new HttpEntity(null),
@@ -108,4 +114,16 @@ public class GraphqlContextBuilder implements GraphQLServletContextBuilder {
                                         }, userID).getBody())
                                 .collect(Collectors.toList())));
     }
+
+    private DataLoader<Long, UserDTO> userAttentionsDataLoader() {
+        return new DataLoader<>(
+                userIDs -> supplyAsync(
+                        () -> new RestTemplate().exchange(
+                                apiEnv.getOrdersEndpoint() + "queryByIds?userIds={userIds}",
+                                HttpMethod.GET,
+                                new HttpEntity(null),
+                                new ParameterizedTypeReference<List<UserDTO>>() {
+                                }, userIDs).getBody()
+                ));
+    }
 }

+ 10 - 1
graphql-api/src/main/java/com/remy/graphql/resolvers/dataloader/UserDataLoaderResolver.java

@@ -21,7 +21,16 @@ public class UserDataLoaderResolver implements GraphQLResolver<UserDTO> {
         if (orderUserDataLoader != null) {
             return orderUserDataLoader.load(userDTO.getId());
         }
-        throw new IllegalStateException("No goods data loader found");
+        throw new IllegalStateException("No order user loader found");
     }
 
+//    public CompletableFuture<List<UserDTO>> attentions(UserDTO userDTO, DataFetchingEnvironment env) {
+//        DataLoaderRegistry registry = ((GraphQLContext) env.getContext()).getDataLoaderRegistry();
+//        DataLoader<Long, List<UserDTO>> userAttentionsDataLoader = registry.getDataLoader("userAttentionsDataLoader");
+//        if (userAttentionsDataLoader != null) {
+//            return userAttentionsDataLoader.load(userDTO.getId());
+//        }
+//        throw new IllegalStateException("No user attentions loader found");
+//    }
+
 }

+ 1 - 1
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/GoodsMutation.java

@@ -2,7 +2,7 @@ package com.remy.graphql.resolvers.mutation;
 
 import com.remy.common.module.GoodsDTO;
 import com.remy.graphql.evn.RestAPIEnv;
-import com.remy.graphql.helper.BeanHelper;
+import com.remy.common.helper.BeanHelper;
 import graphql.kickstart.tools.GraphQLMutationResolver;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/OrderMutation.java

@@ -2,7 +2,7 @@ package com.remy.graphql.resolvers.mutation;
 
 import com.remy.common.module.OrderDTO;
 import com.remy.graphql.evn.RestAPIEnv;
-import com.remy.graphql.helper.BeanHelper;
+import com.remy.common.helper.BeanHelper;
 import graphql.kickstart.tools.GraphQLMutationResolver;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/UserMutation.java

@@ -2,7 +2,7 @@ package com.remy.graphql.resolvers.mutation;
 
 import com.remy.common.module.UserDTO;
 import com.remy.graphql.evn.RestAPIEnv;
-import com.remy.graphql.helper.BeanHelper;
+import com.remy.common.helper.BeanHelper;
 import graphql.kickstart.tools.GraphQLMutationResolver;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 4 - 0
graphql-api/src/main/resources/graphqls/user.graphqls

@@ -23,6 +23,8 @@ type User {
     updateTime: DateTime!
     # 订单列表
     orders: [Order]
+    # 关注人列表
+#    attentions: [User]
 }
 
 enum Gender{
@@ -47,4 +49,6 @@ input UserInput{
     birthday: Date!
     # 地址列表
     addresses:[String]
+    # 关注人Id列表
+#    attentionIds: [ID]
 }

+ 5 - 0
order-service/src/main/java/com/remy/order/controller/OrderController.java

@@ -1,7 +1,9 @@
 package com.remy.order.controller;
 
+import com.remy.common.helper.BeanHelper;
 import com.remy.order.entity.Order;
 import com.remy.order.service.OrderService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -10,6 +12,7 @@ import java.util.List;
 import java.util.Map;
 
 @RestController
+@Slf4j
 @RequestMapping("orders")
 public class OrderController {
 
@@ -23,11 +26,13 @@ public class OrderController {
 
     @RequestMapping("{orderNo}")
     public Order findBySerialNo(@PathVariable("orderNo") String orderNo) {
+        log.info("query order by orderNo: {}", orderNo);
         return orderService.findByOrderNo(orderNo);
     }
 
     @RequestMapping("query")
     public List<Order> findAllByCondition(@RequestParam Map<String, String> params) {
+        log.info("query order by condition: {}", BeanHelper.toJSON(params));
         return orderService.findByCondition(
                 Order.builder()
                         .goodsSerialNo(params.get("goodsSerialNo"))

+ 1 - 1
order-service/src/main/java/com/remy/order/entity/Order.java

@@ -1,6 +1,6 @@
 package com.remy.order.entity;
 
-import com.remy.common.entity.BaseEntity;
+import com.remy.base.entity.BaseEntity;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;

+ 6 - 0
pom.xml

@@ -120,6 +120,12 @@
                 <artifactId>commons-lang3</artifactId>
                 <version>3.11</version>
             </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>2.11.3</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 14 - 4
user-service/src/main/java/com/remy/user/controller/UserController.java

@@ -1,13 +1,16 @@
 package com.remy.user.controller;
 
+import com.remy.common.helper.BeanHelper;
 import com.remy.user.entity.User;
 import com.remy.user.service.UserService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
 @RestController
+@Slf4j
 @RequestMapping("users")
 public class UserController {
 
@@ -15,22 +18,29 @@ public class UserController {
     UserService userService;
 
     @RequestMapping
-    public List<User> findAll(){
+    public List<User> findAll() {
         return userService.findAll();
     }
 
     @PostMapping
-    public User createUser(@RequestBody User user){
+    public User createUser(@RequestBody User user) {
         return userService.save(user);
     }
 
     @GetMapping("{userId}")
-    public User findById(@PathVariable("userId") Long userId){
+    public User findById(@PathVariable("userId") Long userId) {
+        log.info("query user by userId: {}", userId);
         return userService.findByID(userId);
     }
 
+    @GetMapping("queryByIds")
+    public List<User> findById(@RequestParam("userIds") List<Long> userIds) {
+        log.info("query user by userIds: {}", BeanHelper.toJSON(userIds));
+        return userService.findAllByIds(userIds);
+    }
+
     @GetMapping("query")
-    public User query(@RequestParam("username") String username){
+    public User query(@RequestParam("username") String username) {
         return userService.findByUsername(username);
     }
 }

+ 5 - 1
user-service/src/main/java/com/remy/user/dao/UserDAO.java

@@ -3,8 +3,12 @@ package com.remy.user.dao;
 import com.remy.user.entity.User;
 import org.springframework.data.jpa.repository.JpaRepository;
 
-public interface UserDAO extends JpaRepository<User,Long> {
+import java.util.List;
+
+public interface UserDAO extends JpaRepository<User, Long> {
 
     User findUserByUsername(String username);
 
+    List<User> findUsersByIdIn(List<Long> ids);
+
 }

+ 6 - 2
user-service/src/main/java/com/remy/user/entity/User.java

@@ -1,6 +1,6 @@
 package com.remy.user.entity;
 
-import com.remy.common.entity.BaseEntity;
+import com.remy.base.entity.BaseEntity;
 import com.remy.common.enumeration.GenderEnum;
 import lombok.Builder;
 import lombok.Data;
@@ -12,7 +12,6 @@ import org.hibernate.annotations.ColumnTransformer;
 import javax.persistence.*;
 import java.time.LocalDate;
 import java.util.List;
-import java.util.Map;
 
 @Entity
 @SuperBuilder
@@ -56,4 +55,9 @@ public class User extends BaseEntity {
     @Singular
     private List<String> addresses;
 
+//    @ElementCollection
+//    @Column(name = "attentions")
+//    @Singular
+//    private List<Long> attentions;
+
 }

+ 2 - 0
user-service/src/main/java/com/remy/user/service/UserService.java

@@ -14,4 +14,6 @@ public interface UserService {
 
     User findByUsername(String username);
 
+    List<User> findAllByIds(List<Long> ids);
+
 }

+ 5 - 0
user-service/src/main/java/com/remy/user/service/impl/UserServiceImpl.java

@@ -33,4 +33,9 @@ public class UserServiceImpl implements UserService {
     public User findByUsername(String username) {
         return userDAO.findUserByUsername(username);
     }
+
+    @Override
+    public List<User> findAllByIds(List<Long> ids) {
+        return userDAO.findUsersByIdIn(ids);
+    }
 }

二進制
初识GraphQL.pptx