SpringCloud应用骨架开发详解

我们每做一个新项目,通常都是从另一个项目把代码拷贝过来,然后在其上做开发。但是这种模式的一个比较大的问题就是会有很多上个项目的遗留代码。因此,开发一个公共的应用骨架系统,在开始其他新项目时,从这个骨架系统开始开发,是一个很好的选择。

我们首先需要创建一个SpringBoot工程,我们可以使用:https://start.spring.io/

如下所所:

上图中比较关键的是从页面右侧“Add Dependencies”按钮弹出的列表中选择“Spring Web”。网站上的工具会生成一个基本的SpringBoot工程,并自动将zip文件下载到本地。
将该文件解压,以idea community版本打开(也可以使用商业版,但是该版本是收费版,出于尊重知识产权的原因,使用免费的社区版)。

我们首先将系统自带的src/main/resources下面的application.properties文件删除,添加application.yaml文件,添加如下内容:

server:
 port: ${port:2208}
spring:
 application:
  name: first-service
logging:
 pattern:
  console: "%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"
  file: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
 level:
  org.springframework.web: DEBUG
 file: app.log

下面我们以Person对象的增、删、改、查操作为例,创建一个REST风格的API。
我们首先在repository包中创建Person对象:

public class Person {
  private Long personId;
  private String firstName;
  private String lastName;
  private int age;
// getter and setters
//......
}

接下来我们来创建REST服务端,在controller包中创建DemoController类:

@RestController
@RequestMapping("/person")
public class DemoController {
  private List<Person> persons = new ArrayList<>();

  @GetMapping
  public List<Person> findAll() {
    return persons;
  }

  @GetMapping("/{personId}")
  public Person findById(@PathVariable("personId") Long personId,
              HttpServletRequest request) {
    String mode = request.getParameter("mode");
    System.out.println("mode=" + mode + "!");
    return persons.stream().filter(item -> item.getPersonId().equals(personId)).findFirst().get();
  }

  @PostMapping
  public Person add(@RequestBody Person p) {
    p.setPersonId((long)(persons.size()+1));
    persons.add(p);
    return p;
  }

  @DeleteMapping("/{personId}")
  public void delete(@PathVariable("personId") Long personId) {
    List<Person> ps = persons.stream().filter(item -> item.getPersonId().
        equals(personId)).collect(Collectors.toList());
    persons.removeAll(ps);
  }

  @PutMapping
  public void update(@RequestBody Person p) {
    Optional<Person> person = persons.stream().filter(item -> item.getPersonId().
        equals(p.getPersonId())).findFirst();
    person.ifPresent(po->persons.set(persons.indexOf(po), p));
  }
}

由于用到了Jdk8以后的一些特性,这里稍做一些解释:

  • 第1行:代表其是一个REST风格服务的类;
  • 第2行:规定所有/person开头的请求,都由本类来进行处理;
  • 第4行:使用泛型技术定义Person列表对象属性;
  • 第6~9行:定义http://server/person请求,返回Json格式Person列表;
  • 第11行:定义http://server/person/101?mode=2形式的请求,首先定义路径中包含的参数101为personId,分别在GetMapping和函数参数中用@RequestParam来定义,其次请求中的queryString使用函数形参中的第二个参数HttpServletRequest来获取;
  • 第14、15行:获取QueryString中的mode参数;
  • 第16行:在过去,我们如要想对List对象进行查找,需要自己遍历List对象,在Jdk8之后,提供了Stream API,可以帮助我们更加高效的进行查找。首先创建stream,这里其实还可以指定是否使用.parellel()并行技术来利用CPU的多核特性。然后在filter中定义查询条件,该查询条件是一个Lambda表达式,也是Jdk8之后引入的新特性,就是对列表中的每个元素item,首先获取personId属性,然后与personId参数进行比较,取相等的记录,由于相等的记录可能存在多条,我们用findFirst来取第一条,其返回结果为Optional类型,Optional同样是Jdk8之后引入的新特性,专门用于避免空指针异常。我们这里,我们非常确信其一定包括Person对象,所以通过.get函数获取出Person对象,并返回;
  • 第19行:在REST风格中,POST请求用于添加新对象;
  • 第20行:在缺省情况下,POST请求的内容通过application/json传递,即客户端需要将内容转换为Json格式,放入POST的请求体中,SpringBoot会自动将请求体的Json内容转化为@RequestBody指定的值对象;
  • 第26行:在REST风格中,DELETE请求用于删除对象,即当用户发送的请求为DELETE /person/101 HTTP/1.0时,代表删除personId=101的对象;
  • 第27行:定义delete函数,获取请求路径上的personId参数;
  • 第28、29行:求出符合查询条件的Person对象列表,同样是先用成stream,在filter中定义查询条件,最后通过collect函数将查询结果转换为列表;
  • 第30行:从persons列表中删除符合条件记录;
  • 第33行:在REST风格中,用PUT请求来进行对象更新;
  • 第34行:通过请求体中的Json字符串,由SpringBoot自动创建Person值对象;
  • 第35、36行:查询出符合条件的记录,类型为Optional,在这里我们虽然可以使用if (ps.ifPresent()) {…},但是这和过去null的处理方式没有什么区别,我们采用更Jdk8的形式,在ifPresent函数中提供了Lambda表达式,这义了对象更新逻辑;

我们下面需要对REST服务进行测试,我们可以通过PostMan来进行测试,但是在这里,我们将采用Swagger来进行测试。这样做主要好处是可以同时生成REST服务的文档。
我们首先在项目根目录下的pom.xml中添加如下内容:

<!-- 开始:添加Swagger支持 -->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.7.0</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.7.0</version>
		</dependency>
		<!-- 结束:添加Swagger支持 -->
		<!-- 开始:读取maven pox.xml文件 -->
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-model</artifactId>
			<version>3.0</version>
		</dependency>
		<!-- 结束:读取maven pox.xml文件 -->

同时给应用类StpApplication添加如下标注:

@EnableSwagger2
@SpringBootApplication
public class StpApplication {
	......

	@Bean
	public Docket api() throws IOException, XmlPullParserException {
		MavenXpp3Reader reader = new MavenXpp3Reader();
		Model model = reader.read(new FileReader("pom.xml"));
		ApiInfoBuilder builder = new ApiInfoBuilder()
				.title("智慧交通平台")
				.description("智慧交通平台API接口文档")
				.version(model.getVersion())
				.contact(new Contact("最老程序员", "www.abc.com", "ua@"));
		return new Docket(DocumentationType.SWAGGER_2).select().
				apis(RequestHandlerSelectors.basePackage("com.zhuanjingkj.stp.demo.controller"))
						.paths(PathSelectors.any()).build()
						.apiInfo(builder.build());
	}
}

就是添加@EnableSwagger2标注信息。在浏览器中输入如下地址:http://localhost:2208/swagger-ui.html

会显示如下图所示页面:

我们可以点击进入对应的接口,可以看到接口的调用方法,同时可以填写真实的数据,对接口进行测试。

到此这篇关于SpringCloud应用骨架开发详解的文章就介绍到这了,更多相关SpringCloud应用骨架 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解基于Spring Cloud几行配置完成单点登录开发

    单点登录概念 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.登录逻辑如上图 基于Spring 全家桶的实现 技术选型: Spring Boot Spring Cloud Spring Security oAuth2 客户端: maven依赖 <dependency> <groupId>org.springframework.boot</g

  • springcloud如何使用dubbo开发rpc服务及调用

    这篇文章主要介绍了springcloud如何使用dubbo开发rpc服务及调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 spring cloud中基于springboot开发的微服务,是基于http的rest接口,也可以开发基于dubbo的rpc接口. 一,创建goodsService模块 1, 在创建的goodsService模块中再创建goodsServiceApi和goodsServiceServer模块 2,在oodsServic

  • SpringCloudGateway开发过程解析

    路由简介: 1.SpringCloudGateWay 是用于替代zuul作为API网关,在gateway中有三个重要的名词:过滤器,断言,路由 过滤器与断言是路由的一部分,路由便是将请求进行一系列的处理后分发到各个服务的一个过程. 路由的过程:首先会加载断言以及路由,在接受到请求后根据断言加载的顺序会匹配到先加载的断言,只有与断言匹配了的请求才会进入路由,没有匹配到的服务会将请求当成普通的访问请求. 2:路由加载断言的方式: 断言加载的方式有四种,分别是配置文件,java编码,数据库以及注册中心

  • spring cloud 阿波罗 apollo 本地开发环境搭建过程

    开源配置中心 - Apollo Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性.服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器. 检出代码 apollo github 可以fork下然后本地使用idea打开 数据库脚本 执行以下脚本创建ApolloConifgDB.ApolloPortalDB apoll

  • SpringCloud应用骨架开发详解

    我们每做一个新项目,通常都是从另一个项目把代码拷贝过来,然后在其上做开发.但是这种模式的一个比较大的问题就是会有很多上个项目的遗留代码.因此,开发一个公共的应用骨架系统,在开始其他新项目时,从这个骨架系统开始开发,是一个很好的选择. 我们首先需要创建一个SpringBoot工程,我们可以使用:https://start.spring.io/ 如下所所: 上图中比较关键的是从页面右侧"Add Dependencies"按钮弹出的列表中选择"Spring Web".网站

  • SpringCloud Feign高级配置详解

    目录 1.Feign对负载均衡的支持 2.Feign对熔断器的支持 3.Feign对请求压缩和响应压缩的支持 4.Feign的日志级别配置 1.Feign对负载均衡的支持 Feign 本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖,可以通过 ribbon.xx 来进行全局配置,也可以通过服务名.ribbon.xx 来对指定服务进行细节配置配置(参考之前,此处略) Feign默认的请求处理超时时长1s,有时候我们的业务确实执行的需要一定时间,那么这个时候,我们就需要调整请求处

  • Vue 短信验证码组件开发详解

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不是一个全能框架--它只聚焦于视图层.因此它非常容易学习,非常容易与其它库或已有项目整合.另一方面,在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动复杂的单页应用. 摘要: 1.该组件基于Vue 2.1.X版本: 1. Vue 组件代码如下: Vue.component('timerBtn

  • Java NIO服务器端开发详解

    一.NIO类库简介 1.缓冲区Buffer Buffer是一个对象,包含一些要写入和读出的数据. 在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在写入数据时,也是从缓冲区写入到通道. 缓冲区实质上是一个数组,通常是一个字节数组(ByteBuffer),也可以是其它类型的数组,此外缓冲区还提供了对数据的结构化访问以及维护读写位置等信息. Buffer类的继承关系如下图所示: 2.通道Channel Channel是一个通道,网络数据通过Chan

  • React-Native 桥接iOS原生开发详解

    react-native的文档的原生模块中可以看到清洗的代码 传送门 接下来先说一下笔者的要实现的功能: 在iOS原生代码中集成高德导航,在RN中用JS去调用原声代码,并进行跳转, 接下来是笔者遇到的问题与不好理解的地方,写出来跟大家分享让大家少走弯路. 刚开始也是一头雾水且查资料也是到处都是但是都没有解决问题. iOS原生写法 在iOS中创建类继承NSObject(OC语言). //类的.h文件 #import <Foundation/Foundation.h> #import <Re

  • Python嵌入C/C++进行开发详解

    如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录.下面我们来看下如何把Python嵌入C/C++中. VC6.0下,打开 tools->options->directories->show directories for,将Python安装目录下的inlude目录添加到inlude files项中,将libs目录添加到library files项中. VC2005下,打开tools->options-

  • C#开发WinForm之DataGridView开发详解

    前言 DataGridView是开发Winform的一个列表展示,类似于表格.学会下面的基本特征用法,再辅以经验,基本功能开发没问题. 基本的数据渲染 根据提供的数据展示出效果. 提供给DataGridView数据源有很多方式,大致有如下三种: 直接增加,每个单元格类型都是DataGridViewTextBoxCell int index=this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[0].Value =

  • javacv开发详解之调用本机摄像头视频

    前言 javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视频,图片等文件后期操作(图片修改,音视频解码剪辑等等功能),这里只使用最简单的本地摄像头调用来演示一下javacv的基础功能 重要: 建议使用最新javaCV1.5版本,该版本已解决更早版本中已发现的大部分bug javacv系列文章使用6个jar包: javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系统平台.jar,opencv.jar,opencv-系

  • javaCV开发详解之收流器实现

    本章基于javaCV实现收流器功能和录制功能 补充:基于本功能可以实现远程流媒体服务器实时视频录制到本地 一.开发所依赖的包 javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系统平台.jar,opencv.jar,opencv-系统平台.jar. 其中ffmpeg-系统平台.jar,opencv-系统平台.jar中的系统平台根据开发环境或者测试部署环境自行更改为对应的jar包,比如windows7 64位系统替换为ffmpeg-x86-x64.jar 本章使用w

  • javaCV开发详解之推流器和录制器的实现

    功能 实现边播放边录制/推流,停止预览即停止录制/推流 开发所依赖的包 javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系统平台.jar,opencv.jar,opencv-系统平台.jar. 其中ffmpeg-系统平台.jar,opencv-系统平台.jar中的系统平台根据开发环境或者测试部署环境自行更改为对应的jar包,比如windows7 64位系统替换为ffmpeg-x86-x64.jar 为什么要这样做:因为ffmpeg-系统平台.jar中存放的是c/

随机推荐