热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud与微服务之订单微服务

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

文章目录

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


订单微服务

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

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

springcloud-goods-order

springcloud-goods-order项目结构

在这里插入图片描述

springcloud-goods-order源码

  OrderController源码:


package com.lyc.controller;import com.lyc.order.entity.Order;
import com.lyc.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("order/{orderId}")public Order queryOrderById(@PathVariable("orderId") String orderId){return this.orderService.queryOrderById(orderId);}}

  ItemFeignClient源码:


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

  OrderProperties源码:


package com.lyc.properties;import com.lyc.order.entity.ItemProperties;
import lombok.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "springcloud-goods") //以springcloud-goods开头的配置被匹配到
public class OrderProperties {private ItemProperties item = new ItemProperties();}

  ItemService源码:


package com.lyc.service;import com.lyc.feign.ItemFeignClient;
import com.lyc.item.entity.Item;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ItemService {@Autowiredprivate ItemFeignClient itemFeignClient;/*** 调用商品的务提供的接口进行查询数据* @param id* @return*/@HystrixCommand(fallbackMethod = "queryItemByIdFallbackMethod") //进行容错处理public Item queryItemById(Long id){return this.itemFeignClient.queryItemById(id);}public Item queryItemByIdFallbackMethod(Long id){ //请求失败执行的方法return new Item(id,"查询商品信息出错!",null,null,null);}}

  OrderService源码:


package com.lyc.service;import com.lyc.item.entity.Item;
import com.lyc.order.dao.OrderDao;
import com.lyc.order.entity.Order;
import com.lyc.order.entity.OrderDetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.*;@Service
public class OrderService {&#64;Autowiredprivate ItemService itemService;&#64;Autowiredprivate OrderDao orderDao;public Order queryOrderById(String orderId){Order order &#61; orderDao.queryOrderById(orderId);if(null &#61;&#61; order){return null;}List<OrderDetail> orderDetails &#61; order.getOrderDetails();for(OrderDetail orderDetail : orderDetails){//通过商品微服务查询商品数据Item item &#61; this.itemService.queryItemById(orderDetail.getItem().getId());if(null &#61;&#61; item){continue;}orderDetail.setItem(item);}return order;}
}

  OrderApplication源码&#xff1a;


package com.lyc;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;&#64;EnableHystrix
&#64;EnableFeignClients
&#64;EnableEurekaServer //申明这是一个Eureka服务
&#64;SpringBootApplication
public class OrderApplication {&#64;Bean //向Spring微服务中定义RestTemplate对象&#64;LoadBalanced //开启负载均衡public RestTemplate restTemplate(){return new RestTemplate(new OkHttp3ClientHttpRequestFactory());}public static void main(String[] args){SpringApplication.run(OrderApplication.class,args);}}

  application.yml源码&#xff1a;

server:port: 8082 #订单端口spring:application:name: springcloud-goods-order #指定服务名springcloud-goods:item:url: http://127.0.0.1:8081/item/eureka:client:registerWithEureka: false #是否将自己注册到Eureka服务中&#xff0c;默认为truefetchRegistry: true #是否从Eureka中获取注册信息&#xff0c;默认为trueserviceUrl: #Eureka客户端与Eureka服务端进行交互的地址defaultZone: http://root:root123&#64;127.0.0.1:6868/eureka/springcloud-goods-item: # 设置成随机访问ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

  ItemServiceTest源码&#xff1a;


package com.lyc.service;import com.lyc.OrderApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&#64;RunWith(SpringJUnit4ClassRunner.class)
&#64;SpringBootTest
&#64;Import(OrderApplication.class)
public class ItemServiceTest {&#64;Autowiredprivate LoadBalancerClient loadBalancerClient;&#64;Testpublic void test(){String serviceId &#61; "springcloud-goods-item";for (int i &#61; 0; i < 100; i&#43;&#43;){ServiceInstance serviceInstance &#61; this.loadBalancerClient.choose(serviceId);System.out.println("第" &#43; (i &#43; 1) &#43; "次&#xff1a;" &#43; serviceInstance.getHost() &#43; ": " &#43; serviceInstance.getPort());}}
}

  pom.xml源码&#xff1a;

springcloud-parentcom.lyc1.0-RELEASE4.0.0springcloud-goods-orderjarSpringCloud微服务&#xff1a;&#xff1a;商品订单服务http://www.example.comUTF-8org.springframework.cloudspring-cloud-dependenciesDalston.SR3pomimportorg.springframework.bootspring-boot-starter-webcom.squareup.okhttp3okhttporg.springframework.cloudspring-cloud-starter-eureka-serverorg.springframework.bootspring-boot-starter-testorg.springframework.cloudspring-cloud-starter-feignorg.springframework.cloudspring-cloud-starter-hystrixcom.lycspringcloud-goods-db${project.artifactId}

结果分析

访问springcloud-goods-order

  启动项目&#xff0c;在浏览器中输入下面的地址访问订单微服务&#xff1a;

http://127.0.0.1:8082/order/13135351635

  其显示的结果如下&#xff1a;

{"orderId": "13135351635","userId": 1,"createDate": 1544665690703,"updateDate": 1544665690703,"orderDetails": [{"orderId": "13135351635","item": {"id": 1,"title": "商品标题1","pic": "http://图片1","desc": "商品描述1","price": 1000}},{"orderId": "13135351635","item": {"id": 2,"title": "商品标题2","pic": "http://图片2","desc": "商品描述2","price": 2000}}]
}

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

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

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

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

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


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
陈政德169384
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有