当前位置: 首页 > 编程日记 > 正文

微服务项目的整合与测试

实验目的

掌握微服务项目的整合使用
掌握Swagger-UI的简单使用

练习内容

1、微服务项目整合

1.1、项目预览

1.1.1、在 https://github.com/shi469391tou/microservice-mallmanagement.git 地址下载,并导入Myeclipse中;

1.1.2、查看项目的结构

1.2、微服务项目的功能介绍

1.2.1、microservice-eureka-server(Eureka注册中心),搭建服务注册中心,子项目将通过配置注册到注册中心。修改配置application文件如下所示:

spring:application:name: eureka-server # 指定应用名称
server:port: 8761
eureka:client:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://localhost:${server.port}/eureka/
#      上线测试需要使用以下配置
#      defaultZone: http://eureka-server:${server.port}/eureka/

1.2.2、microservice-gateway-zuul,作为其他微服务项目的API网关,实现其他微服务接口的动态代理。配置application文件如下所示:

spring:application:name: gateway-zuul # 指定应用名称cloud:inetutils:preferred-networks:- 10.0   # 设置注册到Eureka中心的优选服务地址server:port: 8050eureka:instance:prefer-ip-address: true  #优选通过IP地址找到对应的服务名称client:#配置eureka注册中心地址serviceUrl:defaultZone: http://localhost:8761/eureka/
#      上线测试需要使用以下配置
#      defaultZone: http://eureka-server:8761/eureka/#设置Hystrix熔断器判定超时时间
#hystrix:
#  command:
#    default:
#      execution:
#        isolation:
#          thread:
#            timeoutInMilliseconds: 60000
zuul:ignoredServices: '*'routes:user-service:path: /user-service/**serviceId: user-serviceorder-service:path: /order-service/**serviceId: order-service

1.2.3、microservice-orderservice,主要用于商品订单管理,并提供有关订单管理的RESTFUL风格和API接口,配置application文件如下所示:

#DB Configuration
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.159.137:3306/microservice_mallmanagement
#    与Docker整合时可使用以下配置(也可以使用具体的ip+端口)
#    url: jdbc:mysql://mysql:3306/microservice_mallmanagementusername: rootpassword: a1s2d3f!application:name: order-service # 指定应用名称cloud:inetutils:preferred-networks:- 10.0   # 设置注册到Eureka中心的优选服务地址server:port: 7900 # 指定该Eureka实例的端口号
eureka:instance:prefer-ip-address: true  #优选通过IP地址找到对应的服务名称client:service-url:defaultZone: http://localhost:8761/eureka/  #配置eureka注册中心地址
#      上线测试需要使用以下配置
#      defaultZone: http://eureka-server:8761/eureka/

1.2.4、在microservice-orderservice中写对应的控制器类:

package com.itheima.controller;
import com.itheima.mapper.OrderMapper;
import com.itheima.po.Order;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderMapper orderMapper;@GetMapping(path="/findOrders/{userid}")@HystrixCommand(fallbackMethod = "findOrderfallback") //断路器public List<Order> findOrder(@PathVariable("userid") Integer userid) {List<Order> orders=  this.orderMapper.selectOrder(userid);return  orders;}//针对上面断路器发现的问题编写回调方法(参数和返回值要一样)public List<Order> findOrderfallback(Integer userid) {List<Order> orders =new ArrayList<>();return orders;}
}

1.2.5、 microservice-userservice,主要用于商品用户管理,并提供有关用户管理的RESTFUL风格和API接口,配置application文件如下所示:

#DB Configuration
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.159.137:3306/microservice_mallmanagement
#    与Docker整合时可使用以下配置(也可以使用具体的ip+端口)
#    url: jdbc:mysql://mysql:3306/microservice_mallmanagementusername: rootpassword: a1s2d3f!application:name: user-service # 指定应用名称cloud:inetutils:preferred-networks:- 10.0   # 设置注册到Eureka中心的优选服务地址
server:port: 8030 # 指定该Eureka实例的端口号
eureka:instance:prefer-ip-address: true  #优选通过IP地址找到对应的服务名称client:service-url:defaultZone: http://localhost:8761/eureka/  #配置eureka注册中心地址
#      上线测试需要使用以下配置
#      defaultZone: http://eureka-server:8761/eureka/
#客户端动态访问常量配置
ORDERSERVICEURL: http://order-service/

1.2.6、在microservice-userservice中写对应的控制器类:

package com.itheima.controller;import com.itheima.mapper.UserMapper;
import com.itheima.po.Order;
import com.itheima.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate UserMapper userMapper;@Value("${ORDERSERVICEURL}")private String ORDERSERVICEURL;@GetMapping(path="/findOrders/{username}")public List<Order> getOrderByUsername(@PathVariable("username")String username) {User user = this.userMapper.selectUser(username);//使用Ribbon后,可以使用http://order-service/而不用使用ip+端口ResponseEntity<List<Order>> rateResponse =restTemplate.exchange(ORDERSERVICEURL+"/order/findOrders/"+user.getId(),HttpMethod.GET, null, new ParameterizedTypeReference<List<Order>>(){});List<Order> orders = rateResponse.getBody();return orders;}
}

1.3 微服务项目启动与测试

1.3.1 在MySQL中创建数据库,并插入数据

CREATE DATABASE microservice_mallmanagement;
USE microservice_mallmanagement;DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (`id` int(11) NOT NULL AUTO_INCREMENT,`createtime` datetime DEFAULT NULL,`number` varchar(255) DEFAULT NULL,`userid` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=UTF8;
INSERT INTO `tb_order` VALUES ('1', '2017-10-09 10:15:44', '201709181459001', '1');
INSERT INTO `tb_order` VALUES ('2', '2017-10-24 18:22:12', '201709181459008', '1');DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`address` varchar(255) DEFAULT NULL,`username` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=UTF8;
INSERT INTO `tb_user` VALUES ('1', 'beijing', 'shitou');

1.3.2、查看表中的订单信息

1.3.3、查看用户表中信息

1.3.4、启动项目并运行成功后,通过地址http://localhost:8761,访问注册中心

1.3.5、测试接口方法  http://localhost:7900/order/findOrders/1

1.3.6、测试API网关服务

http://localhost:8050/order-service/order/findOrders/1

2、接口可视化工具(Swagger-UI)的使用

2.1、Swagger-UI使用方法

2.1.1、下载Swagger-UI项目 https://github.com/swagger-api/swagger-ui.git

2.1.2、引入Swagger-UI

a)用户管理类

b)订单管理类

2.1.3、加入Swagger依赖

<!-- Use Swagger UI for REST API test --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.2.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version></dependency>

a)用户管理类

b)订单管理类

2.1.4、编写配置类

a)订单管理类

b)用户管理类

2.2、Swagger-UI使用测试

2.2.1、整合测试

重新启动项目,通过对应服务地址IP+端口+swagger-ui.html,列出接口控制类:

2.2.2、接口测试

单击user-controller面板,展示接口所有方法,单击某个方法,列出详细信息

在参数信息栏,输入username的参数值shitou,单击Try it out按钮进行测试

从图中可以看出,该方法查询出了username为shitou的用户订单信息,同时还提供了curl和URL两种请求方式,如果接口方法出现变更,只需要将对应的服务重启,并刷新文档页面就会自动更新对应的方法.

3、总结

学习掌握了Swagger-UI测试工具,该工具能在项目开发中高开发的效率以及简化操作

相关文章:

mysql单表多timestamp的current_timestamp设置问题

一个表中出现多个timestamp并设置其中一个为current_timestamp的时候经常会遇到 1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause 原因是当你给一个timestamp设置为on update current_time…

iOS 关于Blocks

*本文参考了《Objective-C高级编程 iOS与OSX多线程和内存管理》一书&#xff0c;关于Block的介绍摘取自此书。 Objective-c 语言中Block语法格式为&#xff1a; 返回值类型 参数列表 表达式 c语言中的函数语法格式为 返回值类型 函数方法名 参数列表 表达式 从上面的…

一步步写STM32 OS【二】环境搭建

一、安装IAR for ARM6.5 二、新建工程 1、选择处理器&#xff1a;STM32F407VG&#xff0c;暂不使用FPU2、必要的路径配置和宏定义3、使用SWO重定向IO输出4、使用ST-LINK仿真器5、下载配置6、设置CPU频率&#xff0c;防止SWO输出乱码三、代码调试 四、工程下载 stepbystep_stm32…

微服务项目的部署

练习目标 掌握Docker Compose编排工具的使用掌握微服务项目与Docker的整合方式掌握微服务项目的部署方式 项目整合参考&#xff1a;https://blog.csdn.net/qq_37823605/article/details/91379272 练习内容 1、Docker Compose编排工具 1.1、Docker Compose的安装与卸载 1.1…

CSS 布局:40个教程、技巧、例子和最佳实践

前言&#xff1a; 布局是WEB开发一个重要的课题&#xff0c;进入XHTML/CSS后&#xff0c;使用TABLE布局的方式逐渐淡出&#xff0c;CSS布局以众多优点成为主流&#xff0c;本文将介绍40个基于CSS的web布局的资源和教程。文章的出处在http://www.noupe.com/css/css-layouts-40-t…

【仿去哪儿登录】UITextField输入时检查输入框是否为空

APP登录时&#xff0c;一般是是等用户输入完账号和密码后才去检查是否为空&#xff0c;而去哪儿登录时&#xff0c;在账号和密码的输入过程中&#xff0c;只要当账号和密码其一为空时&#xff0c;登录按钮立即变成不可用&#xff08;图1&#xff09;&#xff0c;只有账号和密码…

sql排名语句

查询全部 select dwmc,pjdf,row_number() over(order by pjdf desc) as paiming from Sab_hhb_zhb inner join jgdx on jgdx.midSab_hhb_zhb.mid查询单个select paiming from (select mid,pjdf,row_number() over(order by pjdf desc) as paiming from Sab_hhb_zhb ) Sab_hhb_z…

Sqoop的基础应用

实验目的要求 了解ET了工具Sqoop&#xff1b;学会安装配置Sqoop&#xff1b;学会使用数据迁移框架Sqoop&#xff1b;使用Sqoop导入MySQL到HDFS和Hive&#xff1b;使用Sqoop导出HDFS数据到MySQL&#xff1b; 实验环境 Java jdk 1.7&#xff1b;apache-maven-3.6.0&#xff1b;…

hadoop程序MapReduce之SingletonTableJoin

需求&#xff1a;单表关联问题。从文件中孩子和父母的关系挖掘出孙子和爷奶关系 样板&#xff1a;child-parent.txt xiaoming daxiong daxiong alice daxiong jack 输出&#xff1a;xiaoming alice xiaoming jack 分析设计&#xff1a; mapper部分设计&#xff1a; 1、<k1,…

Android网络框架Volley的快速使用

一.基本使用 之前做Android开发都是使用学长自己封装好的网络请求框架&#xff0c;第三方网络框架也很多&#xff0c;网上搜索了一下&#xff0c;大多数人推荐使用 android-async-httpokhttpVolley 其中Volley是Google推出了官方的针对Android平台上的网络通信库&#xff0c;能…

浏览器版本过低

http://study.163.com/common/errors/notSupported.htm <div class"wb f-cb"> <a href"http://www.google.cn/intl/zh-CN/chrome/browser/" class"g f-hide" target"_blank">谷歌浏览器</a> <a href"http:/…

Spark的基础应用

目的要求 搭建Spark集群环境&#xff1b;Spark集群的启动、浏览与关闭&#xff1b;使用Eclipse编写Spark应用程序包&#xff1b;如何运行Spark任务&#xff1b; 实验环境 Java jdk 1.7&#xff1b;apache-maven-3.6.0&#xff1b;Eclipse&#xff1b;Apache_Hadoop集群&#…

HDU-2084 数塔 经典dp,水

1、HDU-2084 数塔 2、链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2084 3、总结&#xff1a;从下往上推&#xff0c;最后归于顶点。方程为 dp[i][j] max(dp[i1][j],dp[i1][j1])a[i][j] #include<iostream> #include<cstring> #include<…

[16] 螺旋面(Spire)图形的生成算法

顶点数据的生成 1 bool YfBuildSpireVertices2 (3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, 6 Yuint slices,7 Yuint s…

iOS的页面跳转

1.通过NavigationController跳转 这个方式适用于根视图为NavigationController的控制器&#xff0c;首先&#xff0c;在storyboard中给跳转的目标控制器视图设置Identifier&#xff0c;名字自定&#xff0c;我这里直接使用Controller对应的名字&#xff0c;如图1&#xff1a;需…

最新Java面试题答案

JAVA基础 JAVA中的几种基本类型&#xff0c;各占用多少字节&#xff1f; 下图单位是bit,非字节 1B8bit String能被继承吗&#xff1f;为什么&#xff1f; 不可以&#xff0c;因为String类有final修饰符&#xff0c;而final修饰的类是不能被继承的&#xff0c;实现细节不允许改…

fedora装机后要运行的脚本(原创)

脚本:sh.sh 1 #!/bin/zsh2 #安装rpmfusion源3 dnf config-manager --add-repohttp://repo.fdzh.org/FZUG/FZUG.repo4 #安装一下有用的一些软件包5 yum -y install yum-fastestmirror 6 yum -y install unrar7 yum -y install thunderbird8 yum -y install emacs9 yum -y instal…

【Android】FragmentTabHost实现底部Tab菜单选项

以前实现类似微博底部菜单使用的是TabHostActivity来实现&#xff0c;但是使用的时候提醒已经被弃用&#xff0c;现在我们可以通过FragmentTabHostFragment来实现。下面就是demo&#xff1a; 1.main_activity.xml 主布局文件。 <LinearLayout xmlns:android"http://sc…

mysql远程访问,修改root密码

mysql -uroot -p #input password use mysql; update user set host% where userroot; flush privileges; #ok 密码root密码也可以改&#xff1a; 先停止正在运行的mysql实例&#xff0c;在配置文件/etc/my.cnf里面加入 skip-grant-tables&#xff0c; 重新启动Mysql 或者使用…

java面试题2019 答案

Java 面试随着时间的改变而改变。在过去的日子里&#xff0c;当你知道 String 和 StringBuilder 的区别&#xff08;String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String…

android layout analyze

adapterapientityhandleruiuntilwidgetappContent.java *************************************图片&#xff1a;drawable&#xff1a;存放各种位图文件&#xff0c;(.png&#xff0c;.jpg&#xff0c;.9png&#xff0c;.gif等)除此之外可能是一些其他的drawable类型的XML文件m…

【转】iOS开发学习计划

转自&#xff1a;简书 一、C语言基础 基本数据类型、基本运算、函数、数组、字符串、指针、结构体、预处理指令、枚举、文件操作、内存管理 二、Objective-C 1、Objective-C基本语法 数据类型、表达式、变量、循环结构、选择结构 2、Objective-C面向对象 类、对象、继承、自省…

[置顶] 单例模式lua实现

--[[优点一、实例控制单例模式会阻止其他对象实例化其自己的单例对象的副本&#xff0c;从而确保所有对象都访问唯一实例。二、灵活性因为类控制了实例化过程&#xff0c;所以类可以灵活更改实例化过程。缺点一、开销虽然数量很少&#xff0c;但如果每次对象请求引用时都要检查…

我在CSDN的第一个1024

1024程序员节日历史 2002年&#xff0c;俄罗斯程序员Valentin Balt收集签名&#xff0c;向俄罗斯联邦政府请愿将9月13日设定为程序员节。 2009年9月11日&#xff0c;俄罗斯总统梅德韦杰夫在节日安排方案上签了名&#xff0c;“程序员节”从此成为了俄罗斯的一个正式节日。除了俄…

【转】判断UIViewController是否正在显示

最近做一个项目&#xff0c;要判断某个ViewController是否正在与用户交互、显示&#xff0c;百度了一下&#xff0c;这篇文章解决了我的问题&#xff0c;故转之&#xff1a;http://edsioon.me/if-uiviewcontroller-is-display/ 某些情况下&#xff0c;需判断当前ViewController…

c#中如何跨线程调用windows窗体控件?

我们在做winform应用的时候&#xff0c;大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题&#xff0c;下面我将详细的介绍。首先来看传统方法&#xff1a; public partial class Form1 : Form{public Form1(){InitializeCompone…

poj 1964 Cow Cycling(dp)

/* 一开始想的二维的 只维护第几只牛还有圈数 后来发现每只牛的能量是跟随每个状态的 所以再加一维 f[i][j][k]表示第i只牛 领跑的j全 已经消耗了k体力 转移的话分两类 1.换一只牛领跑 那么就从f[i][j][k]转移到f[i1][j][j] 2.不换 那就枚举i领跑几圈l f[i][j-l][k-l*l]转移到…

高级网络配置《 bond team桥接 》的建立

bond 资料详情 一、链路聚合&#xff1a;以太网链路聚合简称链路聚合&#xff0c;它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而实现增加链路带宽的目的。同时&#xff0c;这些捆绑在一起的链路通过相互间的动态备份&#xff0c;可以有效地提高链路…

iOS通过CAShapeLayer和UIBezierPath画环形进度条

UIBezierPath可以绘制矢量路径&#xff0c;而CAShapeLayer是Layer的子类&#xff0c;可以在屏幕进行绘制&#xff0c;本文主要思想是&#xff1a;CAShapeLayer按照UIBezierPath的矢量路径进行绘制。 效果图如图&#xff1a; 方法如下&#xff1a; interface ViewController ()…

这些云计算技术你了解过哪几种

新霸哥发现目前信息量高速增长的今天&#xff0c;IT行业正在面临着空间和成本等资源的巨大压力&#xff0c;但是随着这些需求的日益增长&#xff0c;在行业中出现了一类全新的解决方案&#xff0c;通过云计算技术对数据中心进行改造。要获得云计算的优势&#xff0c;必须在it基…