Spring Cloud与微服务之订单微服务

小灰灰 2022-04-05 15:18 478阅读 0赞

文章目录

  • 订单微服务
  • springcloud-goods-order
    • springcloud-goods-order项目结构
    • springcloud-goods-order源码
  • 结果分析
    • 访问springcloud-goods-order

订单微服务

  订单微服务的主要作用是从商品微服务中获取与订单相关的商品条目信息,进而完成对于订单数据的请求操作。

  由于这里采用的是分布式的微服务架构,因而订单微服务中的商品条目信息是从两个商品微服务中以某种规则进行访问的,而这里,我们采用的是使用订单微服务以随机的方式访问不同的商品微服务。

springcloud-goods-order

springcloud-goods-order项目结构

在这里插入图片描述

springcloud-goods-order源码

  OrderController源码:

  1. package com.lyc.controller;
  2. import com.lyc.order.entity.Order;
  3. import com.lyc.service.OrderService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RestController;
  8. @RestController
  9. public class OrderController {
  10. @Autowired
  11. private OrderService orderService;
  12. @GetMapping("order/{orderId}")
  13. public Order queryOrderById(@PathVariable("orderId") String orderId){
  14. return this.orderService.queryOrderById(orderId);
  15. }
  16. }

  ItemFeignClient源码:

  1. package com.lyc.feign;
  2. import com.lyc.item.entity.Item;
  3. import org.springframework.cloud.netflix.feign.FeignClient;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. @FeignClient(value = "springcloud-goods-item") //声明这是一个Feign的客户端
  7. public interface ItemFeignClient {
  8. @GetMapping("/item/{id}")
  9. public Item queryItemById(@PathVariable("id") Long id);
  10. }

  OrderProperties源码:

  1. package com.lyc.properties;
  2. import com.lyc.order.entity.ItemProperties;
  3. import lombok.*;
  4. import org.springframework.boot.context.properties.ConfigurationProperties;
  5. import org.springframework.stereotype.Component;
  6. @Getter
  7. @Setter
  8. @Builder
  9. @ToString
  10. @NoArgsConstructor
  11. @AllArgsConstructor
  12. @Component
  13. @ConfigurationProperties(prefix = "springcloud-goods") //以springcloud-goods开头的配置被匹配到
  14. public class OrderProperties {
  15. private ItemProperties item = new ItemProperties();
  16. }

  ItemService源码:

  1. package com.lyc.service;
  2. import com.lyc.feign.ItemFeignClient;
  3. import com.lyc.item.entity.Item;
  4. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class ItemService {
  9. @Autowired
  10. private ItemFeignClient itemFeignClient;
  11. /** * 调用商品的务提供的接口进行查询数据 * @param id * @return */
  12. @HystrixCommand(fallbackMethod = "queryItemByIdFallbackMethod") //进行容错处理
  13. public Item queryItemById(Long id){
  14. return this.itemFeignClient.queryItemById(id);
  15. }
  16. public Item queryItemByIdFallbackMethod(Long id){ //请求失败执行的方法
  17. return new Item(id,"查询商品信息出错!",null,null,null);
  18. }
  19. }

  OrderService源码:

  1. package com.lyc.service;
  2. import com.lyc.item.entity.Item;
  3. import com.lyc.order.dao.OrderDao;
  4. import com.lyc.order.entity.Order;
  5. import com.lyc.order.entity.OrderDetail;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import java.util.*;
  9. @Service
  10. public class OrderService {
  11. @Autowired
  12. private ItemService itemService;
  13. @Autowired
  14. private OrderDao orderDao;
  15. public Order queryOrderById(String orderId){
  16. Order order = orderDao.queryOrderById(orderId);
  17. if(null == order){
  18. return null;
  19. }
  20. List<OrderDetail> orderDetails = order.getOrderDetails();
  21. for(OrderDetail orderDetail : orderDetails){
  22. //通过商品微服务查询商品数据
  23. Item item = this.itemService.queryItemById(orderDetail.getItem().getId());
  24. if(null == item){
  25. continue;
  26. }
  27. orderDetail.setItem(item);
  28. }
  29. return order;
  30. }
  31. }

  OrderApplication源码:

  1. package com.lyc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  5. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  6. import org.springframework.cloud.netflix.feign.EnableFeignClients;
  7. import org.springframework.cloud.netflix.hystrix.EnableHystrix;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
  10. import org.springframework.web.client.RestTemplate;
  11. @EnableHystrix
  12. @EnableFeignClients
  13. @EnableEurekaServer //申明这是一个Eureka服务
  14. @SpringBootApplication
  15. public class OrderApplication {
  16. @Bean //向Spring微服务中定义RestTemplate对象
  17. @LoadBalanced //开启负载均衡
  18. public RestTemplate restTemplate(){
  19. return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
  20. }
  21. public static void main(String[] args){
  22. SpringApplication.run(OrderApplication.class,args);
  23. }
  24. }

  application.yml源码:

  1. server:
  2. port: 8082 #订单端口
  3. spring:
  4. application:
  5. name: springcloud-goods-order #指定服务名
  6. springcloud-goods:
  7. item:
  8. url: http://127.0.0.1:8081/item/
  9. eureka:
  10. client:
  11. registerWithEureka: false #是否将自己注册到Eureka服务中,默认为true
  12. fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
  13. serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
  14. defaultZone: http://root:root123@127.0.0.1:6868/eureka/
  15. springcloud-goods-item: # 设置成随机访问
  16. ribbon:
  17. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

  ItemServiceTest源码:

  1. package com.lyc.service;
  2. import com.lyc.OrderApplication;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.cloud.client.ServiceInstance;
  8. import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
  9. import org.springframework.context.annotation.Import;
  10. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  11. @RunWith(SpringJUnit4ClassRunner.class)
  12. @SpringBootTest
  13. @Import(OrderApplication.class)
  14. public class ItemServiceTest {
  15. @Autowired
  16. private LoadBalancerClient loadBalancerClient;
  17. @Test
  18. public void test(){
  19. String serviceId = "springcloud-goods-item";
  20. for (int i = 0; i < 100; i++){
  21. ServiceInstance serviceInstance = this.loadBalancerClient.choose(serviceId);
  22. System.out.println("第" + (i + 1) + "次:" + serviceInstance.getHost() + ": " + serviceInstance.getPort());
  23. }
  24. }
  25. }

  pom.xml源码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <artifactId>springcloud-parent</artifactId>
  6. <groupId>com.lyc</groupId>
  7. <version>1.0-RELEASE</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springcloud-goods-order</artifactId>
  11. <packaging>jar</packaging>
  12. <name>SpringCloud微服务::商品订单服务</name>
  13. <url>http://www.example.com</url>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. </properties>
  17. <!--导入SpringCloud的依赖管理-->
  18. <dependencyManagement>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-dependencies</artifactId>
  23. <version>Dalston.SR3</version>
  24. <type>pom</type>
  25. <scope>import</scope>
  26. </dependency>
  27. </dependencies>
  28. </dependencyManagement>
  29. <dependencies>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-web</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>com.squareup.okhttp3</groupId>
  36. <artifactId>okhttp</artifactId>
  37. </dependency>
  38. <!--导入Eureka服务的依赖-->
  39. <dependency>
  40. <groupId>org.springframework.cloud</groupId>
  41. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  42. </dependency>
  43. <!--引入Spring的单元测试-->
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework.cloud</groupId>
  50. <artifactId>spring-cloud-starter-feign</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.cloud</groupId>
  54. <artifactId>spring-cloud-starter-hystrix</artifactId>
  55. </dependency>
  56. <dependency>
  57. <groupId>com.lyc</groupId>
  58. <artifactId>springcloud-goods-db</artifactId>
  59. </dependency>
  60. </dependencies>
  61. <build>
  62. <finalName>${project.artifactId}</finalName>
  63. </build>
  64. </project>

结果分析

访问springcloud-goods-order

  启动项目,在浏览器中输入下面的地址访问订单微服务:

  1. http://127.0.0.1:8082/order/13135351635

  其显示的结果如下:

  1. {
  2. "orderId": "13135351635",
  3. "userId": 1,
  4. "createDate": 1544665690703,
  5. "updateDate": 1544665690703,
  6. "orderDetails": [
  7. {
  8. "orderId": "13135351635",
  9. "item": {
  10. "id": 1,
  11. "title": "商品标题1",
  12. "pic": "http://图片1",
  13. "desc": "商品描述1",
  14. "price": 1000
  15. }
  16. },
  17. {
  18. "orderId": "13135351635",
  19. "item": {
  20. "id": 2,
  21. "title": "商品标题2",
  22. "pic": "http://图片2",
  23. "desc": "商品描述2",
  24. "price": 2000
  25. }
  26. }
  27. ]
  28. }

  当我们重复刷新上面的访问地址时,我们可以看到,在商品微服务springcloud-goods-item的控制台中输出下面的信息:

  1. 2018-12-13 09:48:31.826 INFO 7876 --- [nio-8081-exec-4] com.lyc.controller.ItemController : ----------springcloud-goods-item中的方法----------
  2. 2018-12-13 09:48:43.632 INFO 7876 --- [nio-8081-exec-5] com.lyc.controller.ItemController : ----------springcloud-goods-item中的方法----------
  3. 2018-12-13 09:48:45.164 INFO 7876 --- [nio-8081-exec-6] com.lyc.controller.ItemController : ----------springcloud-goods-item中的方法----------
  4. 2018-12-13 09:48:45.621 INFO 7876 --- [nio-8081-exec-7] com.lyc.controller.ItemController : ----------springcloud-goods-item中的方法----------
  5. 2018-12-13 09:48:45.626 INFO 7876 --- [nio-8081-exec-8] com.lyc.controller.ItemController : ----------springcloud-goods-item中的方法----------
  6. 2018-12-13 09:48:46.077 INFO 7876 --- [nio-8081-exec-9] com.lyc.controller.ItemController : ----------springcloud-goods-item中的方法----------
  7. 2018-12-13 09:48:47.390 INFO 7876 --- [a-EvictionTimer]

  同时,我们在商品微服务springcloud-goods-item2的控制台中也可以看到类似的信息:

  1. 2018-12-13 09:48:43.747 INFO 25508 --- [nio-8083-exec-2] com.lyc.controller.ItemController : ----------springcloud-goods-item2中的方法----------
  2. 2018-12-13 09:48:44.527 INFO 25508 --- [nio-8083-exec-1] com.lyc.controller.ItemController : ----------springcloud-goods-item2中的方法----------
  3. 2018-12-13 09:48:44.534 INFO 25508 --- [nio-8083-exec-3] com.lyc.controller.ItemController : ----------springcloud-goods-item2中的方法----------
  4. 2018-12-13 09:48:45.157 INFO 25508 --- [nio-8083-exec-4] com.lyc.controller.ItemController : ----------springcloud-goods-item2中的方法----------
  5. 2018-12-13 09:48:46.072 INFO 25508 --- [nio-8083-exec-5] com.lyc.controller.ItemController : ----------springcloud-goods-item2中的方法----------

  这说明,订单微服务springcloud-goods-order是以随机的方式在访问商品微服务springcloud-goods-item与商品微服务springcloud-goods-item2的。

发表评论

表情:
评论列表 (有 0 条评论,478人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务Spring Cloud

    微服务与Spring Cloud   要想搭建一套微服务架构需要考虑如下几个问题: 1、微服务之间的通信协议,需要使用同一的通信协议; 2、网络拥塞与延迟,一个请求跨多