一、开始使用Spring Cloud实战微服务
1、SpringCloud是什么?
云计算的解决方案?不是
SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具集(全家桶)。
SpringCloud拥有SpringBoot的特点。
2、关于SpringCloud的版本?
大部分spring软件的版本是以:主版本.次版本.增量版本.里程碑版本的形式命名。
Spring Cloud Angel SR6???
Angel是SpringCloud的一个大版本,Service Release6版本,标识一个bug修复的版本。
3、SpringCloud的特点?
1)、约定优于配置
2)、开箱即用、快速启动
3)、适用于各种环境(PC Server、云环境、Subtopic、容器Docker)
4)、轻量级的组件(如服务发现中整合的Eureka)
5)、组件支持很丰富、功能很齐全(如提供配置中心、注册中心、智能路由…)
6)、选型中立(服务发现中使用Eureka、Zookeeper、Consul等都可以)
二、需要的技术储备
1、java(scala、Groovy…均可)
2、构建工具
1)、Maven
2)、Gradle
将maven项目转换成gradle项目:(在pom文件的上一级目录执行如下命令,使用cmd操作)
gradle init --type pom
3)、SpringBoot:http://cnblogs.com/mmzs/category/1192166.html
三、使用的软件版本
1、原则:使用最新的版本进行讲解
2、JDK 1.8
3、Maven 3.3.9
4、IDE(Spring Tool Suite 3.8.2、IDEA、Eclipse)
5、Spring Boot
6、SpringCloud Camden SR1
建议:大家学习时,尽量使用相同的版本进行选择,避免采坑
四、创建工程
1、创建调用关系的微服务
创建存在调用关系的微服务,调用关系如下
服务消费者:服务的调用方,调用别的微服务的微服务(即:依赖其他服务的服务)
服务提供者:服务的被调用方,提供API的微服务(即:为其他服务提供服务的服务)
2、编写一个服务提供者
登陆:http://start.spring.io/
填写信息:
(1)、将生成的maven工程导入eclipse
然后一次创建如下选中的类和配置文件。
(2)、data.sql和schema.sql
data.sql
schema.sql
(3)、配置文件application.yml
schema.sql
(4)、创建UserController
UserController
(5)、创建UserRepository
UserRepository
(6)、创建实体类User
User
注:此处采用的是jpa,使用的是h2数据库,如果访问时出现实体类转化json格式错误,则需要在实体类前面加上如下这句注释:
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
错误提示:disable SerializationFeature.FAIL_ON_EMPTY_BEANS
(7)、执行MicroserviceSimpleProviderUserApplication类,然后进行访问测试
3、编写一个服务消费者
登陆:http://start.spring.io/
填写信息:
(1)、将生成的maven工程导入eclipse
然后一次创建如下选中的类和配置文件。
(2)、配置文件application.yml
server:
port: 6901
(3)、创建GoodsController
GoodsController
(4)、创建实体类User
User
(5)、在MicroserviceSimpleConsumerGoodsApplication类中注入Bean
其中11-16行表示注入的Bean
MicroserviceSimpleConsumerGoodsApplication
(5)、执行MicroserviceSimpleConsumerGoodsApplication类,然后进行访问测试
4、小小优化一下
主要优化的点是在GoodsController类中的硬编码部分。简单优化如下:
@RestController
public class GoodsController {
@Autowired
private RestTemplate restTemplate;
//优化部分
@Value("${user.userServicePath}")
private String userServicePath;
//优化后此处的硬编码字符串,修改为变量获取
@GetMapping("/goods/{id}")
public User findById(@PathVariable Long id) {
//采用了硬编码注册user服务
return this.restTemplate.getForObject(this.userServicePath + id, User.class);
}
}
这样子的话,userServicePath的具体值需要通过配置文件application.yml来配置,故application.yml文件修改为:
server:
port: 6901
# 优化部分
user:
userServicePath: http://localhost:6900/user/
注: 其实这样子的优化也不是很好,因为当微服务过多时,层层调用,需要修改的部分也会越来越多,不便于维护和修改。具体措施,详见下回分解。
本文暂时没有评论,来添加一个吧(●'◡'●)