微服务器搭建spring
① 微服务框架之Spring Cloud简介
在了解 Spring Cloud 之前先了解一下微服务架构需要考量的核心关键点,如下图:
对于以上等核心关键点的处理,不需要我们重复造车轮, Spring Cloud 已经帮我们集成了,它使用 Spring Boot 风格将一些比较成熟的微服务框架组合起来,屏蔽掉了复杂的配置和实现原理,为快速构建微服务架构的应用提供了一套基础设施工具和开发支持。
Spring Cloud 所提供的核心功能包含:
Spring Cloud架构图
Spring Cloud子项目
Spring Cloud 旗下的子项目大致可以分为两类:
如下:
1. Spring Cloud 与 Spring Boot
Spring Boot 可以说是微服务架构的核心技术之一。通过在 Spring Boot 应用中添加 Spring MVC 依赖,就可以快速实现基于 REST 架构的服务接口,并且可以提供对 HTTP 标准动作的支持。而且 Spring Boot 默认提供 JackJson 序列化支持,可以让服务接口输入、输出支持 JSON 等。因此,当使用 Spring Cloud 进行微服务架构开发时,使用 Spring Boot 是一条必经之路。
2. Spring Cloud 与服务治理( Eureka )
服务治理是 Spring Cloud 的核心,在实现上其提供了两个选择,即 Consul 和 Netflix 的 Eureka 。
Eureka 提供了服务注册中心、服务发现客户端,以及注册服务的 UI 界面应用。
在 Eureka 的实现中,节点之间相互平等,有部分注册中心“挂掉”也不会对整个应用造成影响,即使集群只剩一个节点存活,也可以正常地治理服务。即使所有服务注册节点都宕机, Eureka 客户端中所缓存的服务实例列表信息,也可让服务消费者能够正常工作,从而保障微服务之间互相调用的健壮性和应用的弹性。
3. Spring Cloud 与客户端负载均衡( Ribbon )
Ribbon 默认与 Eureak 进行无缝整合,当客户端启动的时候,从 Eureka 服务器中获取一份服务注册列表并维护在本地,当服务消费者需要调用服务时, Ribbon 就会根据负载均衡策略选择一个合适的服务提供者实例并进行访问。
Spring Cloud 通过集成 Netflix 的 Feign 项目,为开发者提供了声明式服务调用,从而简化了微服务之间的调用处理方式。并且默认 Feign 项目集成了 Ribbon ,使得声明式调用也支持客户端负载均衡功能。
4. Spring Cloud 与微服务容错、降级( Hystrix )
为了给微服务架构提供更大的弹性,在 Spring Cloud 中,通过集成 Netflix 下子项目 Hystrix ,通过所提供的 @HystrixCommand 注解可以轻松为我们所开发的微服务提供容错、回退、降级等功能。此外, Hystrix 也默认集成到 Feign 子项目中。
Hystrix 是根据“断路器”模式而创建。当 Hystrix 监控到某服务单元发生故障之后,就会进入服务熔断处理,并向调用方返回一个符合预期的服务降级处理( fallback ),而不是长时间的等待或者抛出调用异常,从而保障服务调用方的线程不会被长时间、不必要地占用,避免故障在应用中的蔓延造成的雪崩效应。
而 Hystrix 的仪表盘项目( Dashboard )可以监控各个服务调用所消耗的时间、请求数、成功率等,通过这种近乎实时的监控和告警,可以及时发现系统中潜在问题并进行处理。
5. Spring Cloud 与服务网关( Zuul )
Spring Cloud 通过集成 Netflix 中的 Zuul 实现 API 服务网关功能,提供对请求的路由和过滤两个功能
路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。
过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
通过 Zuul ,可以将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,对外整个服务只需要暴露一个 API 接口,屏蔽了服务端的实现细节。通过 Zuul 的反向代理功能,可以实现路由寻址,将请求转发到后端的粗粒度服务上,并做一些通用的逻辑处理。此外, Zuul 默认会与 Eureka 服务器进行整合,自动从 Eureka 服务器中获取所有注册的服务并进行路由映射,实现 API 服务网关自动配置。
6. Spring Cloud 与消息中间件( Stream )
Spring Cloud 为简化基于消息的开发,提供了 Stream 子项目,通过建立消息应用抽象层,构建了消息收发、分组消费和消息分片等功能处理,将业务应用中的消息收发与具体消息中间件进行解耦,使微服务应用开发中可以非常方便地与 Kafka 和 RabbitMQ 等消息中间件进行集成。
Spring Cloud Bus 基于 Stream 进行扩展,可以作为微服务之间的事件、消息总线,用于服务集群中状态变化的传播。
比如 Spring Cloud Config 借助 Bus ,可以实现配置的动态刷新处理。
7. Spring Cloud 与分布式配置中心( Config )
针对微服务架构下的配置文件管理需求, Spring Cloud 提供了一个 Config 子项目。 Spring Cloud Config 具有中心化、版本控制、支持动态更新和语言独立等特性。
在 Config 子项目中将微服务应用分为两种角色:配置服务器( Config Server )和配置客户端( Config Client )。使用配置服务器集中地管理所有配置属性文件,配置服务中心可以将配置属性文件存储到 Git 、 SVN 等具有版本管理仓库中,也可以存放在文件系统中。默认采用 Git 的方式进行存储,因此可以很容易地对配置文件进行修改,并实现版本控制。
8. Spring Cloud 与微服务链路追踪( Sleuth )
Spring Cloud 中的 Sleuth 子项目为开发者提供了微服务之间调用的链路追踪。
Sleuth 核心思想就是通过一个全局的 ID 将分布在各微服务服务节点上的请求处理串联起来,还原了调用关系,并借助数据埋点,实现对微服务调用链路上的性能数据的采集。
因此,通过 Sleuth 可以很清楚地了解到一个用户请求经过了哪些服务、每个服务处理花费了多长时间,从而可以对用户的请求进行分析。此外,通过将采集的数据发送给 Zipkin 进行存储、统计和分析,从而可以实现可视化的分析和展示,帮助开发者对微服务实施优化处理。
9. Spring Cloud 与微服务安全( Security )
Spring Cloud Security 为我们提供了一个认证和鉴权的安全框架,实现了资源授权、令牌管理等功能,同时结合 Zuul 可以将认证信息在微服务调用过程中直接传递,简化了我们进行安全管控的开发。
Spring Cloud Security 默认支持 OAuth 2.0 认证协议,因此单点登录也可以非常容易实现,并且 OAuth2.0 所生成的令牌可以使用 JWT 的方式,进一步简化了微服务中的安全管理。
10. Spring Cloud 的其他子项目
② SpringCloud(六)——微服务集群
为了避免Eureka的单点故障,我们搭建了Eureka集群。
要是微服务发生了单点故障怎么办呢?
那么就要搭建微服务集群了。
我们再新建一个服务提供者,之前有了一个8001的提供者,我们用同样的方式创建一个8002端口的提供者,可以参考我之前写的:
https://www.jianshu.com/p/e1b08eeb1d1e
8001工程里面的类和配置文件在8002里都要有一份,只不过我们要将端口改成8002。
因为之前只有一个服务提供者,我们也就无需区分请求发到了哪个服务。现在我们有两个服务提供者了,所以我们要区分一下发到了哪个服务,需要再controller里改一下。
添加端口号的属性,并且作为数据返回。
改造号了之后我们要先分别单独发送一下8001和8002的服务看看是否可以返回,确保微服务没问题。
服务提供者没问题了接下来改造消费者。
消费者里面需要改的有两处controller和config
在消费者的controller里,我们通过restTemplate来和提供者进行通讯,之前的写法是写死了一个url来供restTemplate发送,因为提供者是集群模式了,所以我们就不能写死发往8001的url了。
我们现在要使用服务名来发送服务。
这里的服务名就是注册到Eureka的服务名。
所以我们要在controller里面使用服务名做url。
因为我们使用了服务名,就不能直接解析成ip地址+端口号的形式了,需要我们在restTemplat上面添加@LoadBalanced注解,这个注解同时可以开启我们默认的负载均衡策略。
先看一下我们启动的工程:
Eureka集群和Payment提供者集群都已经搭建好了。并且注册中心中也有实例信息。
那么我们多发送几个请求看看结果。
我们可以看到发送到消费者的服务被依次分发到8001和8002的两个服务上了。
说明我们的负载均衡也生效了!
③ 使用 IDEA 从 0 开始搭建 Spring Cloud 微服务
以下内容均来源于一个微服务初学者的实践,仅供参考。
首先启动 Spring Cloud Eureka 注册中心,其他部分都作为服务注册到 Eureka ,并通过注册的服务名互相访问。Spring Cloud Config 提供统一的配置信息,供其他服务读取。Provider 生产者服务不直接对外暴露,仅供 Consumer 消费者服务调用。用户通过 Spring Cloud Gateway 统一访问消费者服务。
首先创建一个空 Maven 项目,然后右键项目 -> New Mole ,选择继续创建空 Maven 模块或者使用 Spring Initializr 构建 Spring Cloud 模块。common模块用于存放公共的 lib ,如 、model 、util 等。config-dev 存放配置文件,上传到 git 之后供 Spring Cloud Config 读取。
除了少数像 Spring Cloud Config 、Spring Cloud Gateway 这种独立应用,大部分非空模块都需要添加 spring-boot-starter-web 构建 Web 应用。下图是使用 IDEA 的 Spring Initializr 快速构建新模块。
下面贴上详细的配置文件和注解,bootstrap.yml 具有高优先级,会提前加载并且不会被 application.yml 覆盖,spring.cloud.config 需要配置在 bootstrap.yml 中,否则不能正常从配置中心获取配置信息。
application.yml
HobbyEurekaApplication.java
application.yml
application-dev.yml
HobbyConfigApplication.java
bootstrap.yml
config-dev/gateway.yml
HobbyGatewayApplication.java
在 Spring Cloud Gateway 的配置中已经展示过如何从 config-dev 配置仓库中读取配置文件。spring.cloud.config 和 eureka.client 都已经在 bootstrap.yml 中配置过,接下来不做赘述。多模块项目中扫描其他模块的 mybatis 文件需要做额外的配置。
application.yml
HobbyProviderTestApplication.java
消费者调用生产者可以使用 Feign 声明式服务调用。
HobbyConsumerTestApplication.java
TestFeignService.java
TestServiceImpl.java
Spring Cloud Eureka >> Spring Cloud Config >> Spring Cloud Gateway >> 其他服务
微服务架构能够将各种服务解耦,单独部署,配合 devops 才能展现出真正的威力,否则运维的工作会苦不堪言。gitlab 目前已经集成了 devops 功能,只要在项目中添加 .gitlab-ci.yml ,push 到 Gitlab 之后就会自动执行配置的命令,这里简单介绍一下 gitlab 的安装部署。
CentOS7 自带的 Git 版本号是 1.8.3.1 ,需要更新,否则 Gitlab Runner 在进行自动构建的时候会报错 fatal: git fetch-pack: expected shallow list ,更新步骤如下:
Gitlab 安装官方文档
Gitlab Runner 安装官方文档
配置文件的地址 /etc/gitlab/gitlab.rb
修改配置文件的操作:
常用配置:
④ 【微服务】- SpringBoot Admin
目录:
Spring Boot Admin 用于管理和监控一个或者多个Spring Boot应用, Spring Boot Admin 分为Server端和Client端,Client通过http向Server端注册, 也可以结合Spring Cloud 的服务注册组件Eureka 进行注册。
SpringAdmin 的监测详细信息有如下:
本文的所有工程的Spring Boot版本为2.2.2.RELEASE,SpringBootAdmin版本为2.2.1。
这样Admin Server就创建好了。
到此,SpringBoot-Admin-Client 工程创建完成。
启动Admin-Server,Admin-Client两个工程,在浏览器上输入localhost:8769 ,浏览器显示的界面如下:
查看wallboard:
更多监控信息,自己体验。
eureka-server搭建完毕。
到此admin-server 搭建完成。
到此,Eureka-Server,Admin-Server-Eureka-Client,Admin-Client-Eureka-Cleint 三个工程搭建完成
启动三个工程,在浏览器上访问localhost:8769,浏览器会显示和上一小节一样的界面。
在2.1.0版本中去掉了hystrix dashboard,登录界面默认集成到了spring security模块,只要加上spring security就集成了登录模块。
重启启动工程,在浏览器上访问: http://localhost:8769/ ,会被重定向到登录界面,登录的用户名和密码为配置文件中配置的,分别为admin和admin,界面显示如下:
源码: https://github.com/lbshold/springboot/tree/master/Spring-Boot-Admin-Demo
⑤ 1. SprignCloud之快速搭建一个简单的微服务工程
springcloud 工程是基于 springboot 工程的。所以我们的父工程的pom直接继承spring-boot-starter-parent,让所有的子工程也作为springboot项目。
然后指定spring-cloud的依赖版本统一为Finchley.RELEASE,这样子工程在引入springcloud相关包的时候就不用特意指定版本了。
我们选择 eureka 作为注册中心。
新建一个子工程,指定parent为刚才我们建立的父工程
Eureka 服务端启动器导入
Eureka 服务端 完整pom文件:
application.properties 配置文件
启动类
新建一个子工程 订单服务,实际上是eureka的客户端。
同样指定parent为刚才我们建立的父工程
引入eureka客户端的pom依赖,以及web包,用来与eureka-server端进行通信。
订单服务完整pom文件:
bootstrap.properties配置文件
启动类
新建一个子工程 订单服务,实际上是eureka的客户端。
同样指定parent为刚才我们建立的父工程
引入eureka客户端的pom依赖,以及web包,用来与eureka-server端进行通信。
用户服务完整pom文件:
bootstrap.properties
启动类
先启动注册中心 eureka服务端工程, 然后启动两个eureka客户端:订单服务和用户服务,看看这两个服务是否都注册到注册中心了。
当订单服务和用户服务 启动注册成功时, 会发现eureka服务端 会有 注册服务实例成功的日志。
查看eureka的 监控页面 http://127.0.0.1:9001/ ,可以看到 服务列表里已经 有 订单服务和用户服务了。
当订单服务 和 用户服务都成功注册 到 注册中心之后,那么 这两个服务 都会定时的从注册中心拉取服务列表, 用于调用。
我们让 订单服务 作为服务提供者,让用户服务调用,测试一下能否调用成功。
模拟 返回某个用户的订单信息
浏览器 调用 用户服务的 /user/orderList接口:
可以看到已经成功通过用户服务的/user/ordeeList接口 调用到了订单服务的/order/list 接口。
⑥ Spring Cloud 微服务实战
阅读《Spring微服务实战》笔记
项目地址: https://gitee.com/liaozb1996/spring-cloud-in-action
配置管理原则:
Spring Cloud Config 后端存储:文件系统、Git
标注引导类:
配置服务器配置:
创建配置文件:
访问配置:
客户端配置:
spring-cloud-config-client 依赖
boostrap.properties
刷新属性:
服务发现至关重要的原因:
传统服务位置解析(DNS+负载均衡器)的缺点:
服务发现实现组件:
构建 Eureka 服务:
标注引导类:
单机模式配置 :
每次注册服务都需要等待30秒,因为 eureka 需要连续接收 3 个心跳包才能使用该服务。
缓存注册表后,客户端每隔30秒会重新到 eureka 刷新注册表。
服务注册:
解决多网卡问题:
通过API获取注册表信息:(设置请求头 Accept:application/json )
http://localhost:8761/eureka/apps
http://localhost:8761/eureka/apps/organization
与 Ribbon 交互的客户端:
当使用二方包时需要在引导类添加 @EntityScan :
配置 RestTemplate:
DiscoveryClient:
支持 Ribbon 的 RestTemplate:
Feign:
OpenFeign 依赖:
Feign 会在运行时动态生成代理对象:
远程调用包括对远程资源和远程服务的调用。
远程调用会遇到两个问题:
四种客户端弹性模式:
为什么客户端弹性模式很重要:
客户端弹性模式提供了三种构建能力:
在引导类启动断路器:
配置属性手册: https://github.com/Netflix/Hystrix/wiki/Configuration
使用 Hystrix 默认配置对远程调用进行管理:
超时配置: execution.isolation.thread.timeoutInMilliseconds
配置后备策略:后备方法必须在同一类中并且具有相同的方法签名
配置舱壁:
Hystrix 断路的策略:
Hystrix 有三个级别的配置:
类级别配置:
Hystrix 有两个隔离策略:
如果使用 TREAD 策略,并且要将父线程的上下文传递到子线程中,需要自定义 HystrixConcurrencyStrategy
Zuul 提供的功能:路由映射、构建过滤器
依赖:zuul、eureka-client
标注引导类:
zuul 配置:
Zuul路由映射机制:
查询路由: http://localhost:8080/actuator/routes
调用服务: http://localhost:8080/license/license/1 (第一个 license 是服务ID,/license/1 是请求路径)
使用服务发现手动映射路由:
添加前缀:
手动配置静态路由:前面都是基于 eureka 上的服务id进行路由映射的,而这里是直接配置URL
Git + http://localhost:8080/actuator/refresh (POST)
Zuul 使用 Hystrix 和 Ribbon
Zuul 支持三种过滤器类型:前置过滤器、后置过滤器、路由过滤器
前置过滤器:向通过网关的请求添加 tracking-id
这里使用了 Zuul 的 RequestContext:
Zuul 不允许直接修改请求头部,这里通过 addZuulRequestHeader 添加头部信息,在调用远程服务会自动合并
为了方便应用获取 tracking-id,这里使用 Filter 获取请求头信息并映射到 UserContext 中:
为了在服务间调用传播 tracking-id 这里需要定义一个 和 RestTemplate:
项目中 license 会远程调用 orgnization,这里需要在两个微服务配置 Filter
⑦ SpringCloud之微服务项目搭建-孰能生巧
初门级别搭建SpringCloud 微服务项目
整理网关、认证、redis、其它服务。
项目创建省略
1.1 版本
Springboot 2.2.5 版本
Springcloud版本 Hoxton.SR8
1.2 父工程名
xxx-springcloud-parent
1.3 父工程引入 pom 依赖包
1.4 父工程搭建完毕
二、公共服务搭建
右键父工程依次创建
公共服务主要存放公共资源,例如工具类,实体类等。
2.1 服务命名:xxx-commons
三、注册中心服务
3.1 服务名:xxx-register
3.2 引入依赖包
3.3 application.yml
3.4 启动类:Application
四、客户服务
主要用于一个客户服务模块
服务名称:customer-server
4.1 依赖包
4.2. application.yml
4.2 启动类Application
五、认证中心服务
5.1 服务名:customer-oauth2-server
5.2 引入依赖包
5.3 application.yml
5.4 启动类
六、网关服务
6.1 服务名:customer-gateway
6.2 引入依赖包
6.3 application.yml
6.4. 启动类
6.5 配置白名单实体类
6.6 过滤 filter
7.访问路径
由于配置了网关服务,端口为80
直接访问 http://localhost/ 地址
8.结束语
主要是通过学习网上视频和网络查找资料整理而来
9.有什么不懂可留言下方,小白相互学习讨论,欧了~
⑧ 微服务 Spring Cloud Alibaba 项目搭建(一、框架介绍)
主要是为了记录 从0到1 搭建Spring Cloud Alibaba 项目的详细步骤,方便想学习搭建Spring Cloud 项目的小伙伴们提供一个详细的示例,欢迎各位大佬评论,互相学习,共同进步。
gitee地址: https://gitee.com/mybride/bi_cloud
⑨ Spring微服务灰度发布(热部署)的实现(二)
接着上篇说,我们微服务中用到的nepxion discovery主要采用了三种灰度发布方式,一种是web图形化界面发布,二是zuul过滤器灰度发布,三是业务参数策略灰度发布。下面将重点介绍三种方式的实现。
一、web图形化界面灰度发布
因为我们项目用到了eureka注册中心,所以选择web图形化界面灰度发布比较合适。
1) 首先需要建立一个discovery控制台工程console, 端口为2222,控制台工程负责web图形化界面请求的处理,运行console工程。
2) 下载discovery ui,地址:https://github.com/Nepxion/DiscoveryUI,运行discovery UI,端口为8090
3)浏览器中输入localhost:8090,即可打开控制台,如下
注意:全链路灰度发布需要在“配置中心”下才可用。灰度发布配置中心,负责存储全链路灰度发布规则,并将规则推送到各个微服务中。而配置中心可用nacos,redis等,Discovery 中提供了相应配置中心的插件包。
二、zuul网关过滤器灰度发布
通过网关过滤器传递Http Header的方式传递全链路灰度路由规则。下面代码只适用于Zuul和Spring Cloud Gateway网关,Service微服务不需要加该方式。
三、业务参数在策略类中自定义灰度路由规则
通过策略方式自定义灰度路由规则。下面代码既适用于Zuul和Spring Cloud Gateway网关,也适用于Service微服务,同时全链路中网关和服务都必须加该方式
上面说了具体灰度规则发布方式,那究竟怎么定义灰度规则呢??
规则是基于XML或者Json为配置方式,存储于本地文件或者远程配置中心,可以通过远程配置中心修改的方式达到规则动态化。其核心代码参考discovery-plugin-framework以及它的扩展、discovery-plugin-config-center以及它的扩展和discovery-plugin-admin-center等,规则示例
XML示例(Json示例见discovery-springcloud-example-service下的rule.json)
黑/白名单的IP地址注册的过滤规则
微服务启动的时候,禁止指定的IP地址注册到服务注册发现中心。支持黑/白名单,白名单表示只允许指定IP地址前缀注册,黑名单表示不允许指定IP地址前缀注册。规则如何使用,见示例说明
最大注册数的限制的过滤规则
微服务启动的时候,一旦微服务集群下注册的实例数目已经达到上限(可配置),将禁止后续的微服务进行注册。规则如何使用,见示例说明
黑/白名单的IP地址发现的过滤规则
微服务启动的时候,禁止指定的IP地址被服务发现。它使用的方式和“黑/白名单的IP地址注册的过滤规则”一致
版本访问的灰度发布规则
版本权重的灰度发布规则
全局版本权重的灰度发布规则
区域权重的灰度发布规则
全局区域权重的灰度发布规则
网关端全链路路由策略的灰度发布规则
注意 路由策略的入口有三个(以{"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.0", "discovery-springcloud-example-c":"1.0;1.2"})为例:
其作用的优先级为外界传入>网关Filter指定>配置中心或者本地rule.xml配置
您可以根据自己需求,自由定义灰度发布规则,灵活实现微服务的灰度发布。
源码位置:https://github.com/Nepxion/Discovery
⑩ 如何搭建spring boot
Helloworld使用传统的springmvc,需要配置web.xml,applicationContext.xml,然后打包为war在tomcat中运行,而如果使用springboot,一切都变得简单起来了。下面使用Maven来创建springboot的webapp工程pom.xml4.0.0org.springframeworkgs-spring-boot0.1.0org.springframework.bootspring-boot-starter-parent1.3.3.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtest1.8org.springframework.bootspring-boot-maven-;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@{@RequestMapping("/")publicStringindex(){return"GreetingsfromSpringBoot!";}}其中:@RestController表示使用springmvc来接收request请求@RequestMapping映射到主页当请求返回的时候,是纯文本,那是因为@RestController是由@Controller和@ResponseBody组成Application@{publicstaticvoidmain(String[]args){ApplicationContextctx=SpringApplication.run(Application.class,args);System.out.println("Let':");}}其中:@SpringBootApplication代表了其有四个注解组成:@Configuration,@EnableAutoConfiguration,@EnableWebMvc,@ComponentScan在SpringApplication.run中会去自动启动tomcatrun方法返回上下文,在这个上下文中可以拿到所有的bean没有一行配置代码、也没有web.xml。基于SpringBoot的应用在大多数情况下都不需要我们去显式地声明各类配置,而是将最常用的默认配置作为约定,在不声明的情况下也能适应大多数的开发场景。总体而言springboot是对javawebapp开发的简化单元测试@RunWith(SpringJUnit4ClassRunner.class)@(classes=MockServletContext.class)@{privateMockMvcmvc;@Beforepublicvoidbefore()throwsException{mvc=MockMvcBuilders.standaloneSetup(newHelloController()).build();}@Afterpublicvoidafter()throwsException{}/****Method:index()**/@TestpublicvoidtestIndex()throwsException{//TODO:Testgoesheremvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("GreetingsfromSpringBoot!")));}}建立restfullweb服务器接上,使用srpingboot建立web服务器就非常简单了,首先建立一个pojo类publicclassGreeting{privatefinallongid;privatefinalStringcontent;}然后使用control来handlehttp请求@{="Hello,%s!";privatefinalAtomicLongcounter=newAtomicLong();@RequestMapping("/greeting")publicGreetinggreeting(@RequestParam(value="name",defaultValue="World")Stringname){returnnewGreeting(counter.incrementAndGet(),String.format(template,name));}}其中:@RequestParam表明了参数要求,如果要必填则设置required=true返回是一个对象,会被自动转换为json当我们访问:greeting时候返回{"id":1,"content":"Hello,World!"}greeting?name=User时候返回{"id":2,"content":"Hello,User!"}数据库访问另一个非常常用的问题。在传统开发中,我们需要配置:类路径上添加数据访问驱动实例化DataSource对象,指定url,username,password注入JdbcTemplate对象,如果使用Mybatis,还要配置框架信息下面一个例子讲述用用springboot来代替。数据访问层我们将使用SpringDataJPA和Hibernate(JPA的实现之一)。开始之前先介绍两个概念springdata为了简化程序与数据库交互的代码,spring提供了一个现成的层框架,spring家族提供的spring-data适用于关系型数据库和nosql数据库;例如SpringDataJPA,SpringDataHadoop,SpringDataMongoDB,SpringDataSolr等;具体的可以参考官网:.mysql.jdbc.Driverspring.datasource.password=xxx#SpecifytheDBMSspring.jpa.database=MYSQL#.jpa.show-sql=true#Hibernateddlauto(create,create-drop,update)spring.jpa.hibernate.ddl-auto=update#Namingstrategyspring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy#)spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect其中,hibernate的ddl-auto=update配置表名,数据库的表和列会自动创建写下实体类:@Entity@Table(name="student")publicclassStudent{@Id@GeneratedValue(strategy=GenerationType.AUTO)privatelongid;@NotNullprivateStringname;privateStringage;}@Entity,说明被这个注解修饰的类应该与一张数据库表相对应,表的名称可以由类名推断,当然了,也可以明确配置,只要加上@Table(name="books")即可。需要特别注意,每个Entity类都应该有一个protected访问级别的无参构造函数,用于给Hibernate提供初始化的入口。@Idand@GeneratedValue:@Id注解修饰的属性应该作为表中的主键处理、@GeneratedValue修饰的属性应该由数据库自动生成,而不需要明确指定。@ManyToOne,@ManyToMany表明具体的数据存放在其他表中,在这个例子里,书和作者是多对一的关系,书和出版社是多对一的关系,因此book表中的author和publisher相当于数据表中的外键;并且在Publisher中通过@OneToMany(mapped="publisher")定义一个反向关联(1——>n),表明book类中的publisher属性与这里的books形成对应关系。@Repository用来表示访问数据库并操作数据的接口,同时它修饰的接口也可以被componentscan机制探测到并注册为bean,这样就可以在其他模块中通过@Autowired织入。:@{ListfindByLastName(StringlastName);}详细的可以看springjpa的具体介绍。最后使用:@{@AutowiredprivateStudentDao;@RequestMapping("/get-student-counts")@(){Liststudents=(List).findAll();returnString.format("%d",students.size());}}主要一点是:我在CustomerRepository实现中每天添加方法:findByLastName,@Autowired就会一直报错。