昨天讲完架构的演变迭代,以及微服务的各种服务传输发送的方式,由于个人的学习因素,我还是主要介绍微服务中使用Spring家族的内容。
Spring Cloud是Spring旗下的项目,其中Spring最擅长的就是集成,即一系列框架的有序结合。它会将很多非常棒的框架拿过来进行集成到自身的项目中去。
所以同理,Spring Cloud就是这样,将现在非常流行的技术整合到一起,实现了诸如:配置管理,服务发现,智能路 由,负载均衡,熔断器,控制总线,集群状态等等功能。
当然这些内容都是微服务后续内容所要提及的内容,所以这篇内容算是总的集合,为后续的内容打下理论基础。
在这里我以个人的认识来展示Spring Cloud所要表达的基础架构部分,如下图:
附加(个人理解):首先用户将请求转发到网关通过调用网关传达服务,通过其中负载均衡方法(Ribbon),较为均衡的调用项目服务。在项目重构或者构建微服务时,势必要先到Eureka注册以完成——“什么样的服务需求来找什么样的服务”,并且后续进行服务调用。项目的配置服务甚至可以以远程Git创建仓库放置配置文件的方式,来完成项目的配置。
当然后面具体开发才能更详细的说明,这里不多啰嗦呵呵。
由于作者更加喜欢使用IDEA创建Maven项目开发,这势必要考虑打包依赖的管理部分。
有意思的是,Spring Cloud是以伦敦地铁站名字命名,这里网站找到的对应表整理如下:
rELEASE tRAIN | Boot Version |
---|---|
Hoxton | 2.2.x |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
这里是微服务场景的模拟,并不真正涉及到微服务本身的整体内容,所以看客老爷们就稍微浏览即可。
如果按照上图架构所表示微服务模拟,那么就要创建若干个微服务。这时候就要先创建父工程打包统一管理子模块的依赖版本
如下展示我的pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.xafgroupId>
<artifactId>spring-cloud-projectartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.5.RELEASEversion>
<relativePath/>
parent>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Greenwich.SR1spring-cloud.version>
<mapper.starter.version>2.1.5mapper.starter.version>
<mysql.version>5.1.46mysql.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapper-spring-boot-starterartifactId>
<version>${mapper.starter.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
首先,我使用的是spring boot的2.1.x版本,就要使用greenwich(格林威治)版本的spring cloud。
其次,使用
进行聚合打包。
这里我创建的数据表如下:
在父工程选中创建模块后,添加依赖如下:
spring-cloud-project
com.xaf
1.0-SNAPSHOT
4.0.0
user-service
org.springframework.boot
spring-boot-starter-web
tk.mybatis
mapper-spring-boot-starter
mysql
mysql-connector-java
然后进行配置文件:
server:
port: 9000
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/user
username: root
password: root
mybatis:
type-aliases-package: com.xaf.pojo
启动类:
@SpringBootApplication
@MapperScan("com.xaf.mapper")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
实体类:
@Data
@Table(name = "tb_user")
public class User{
// id
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
// 备注
private String note;
}
mapper接口:
public interface UserMapper extends Mapper<User> {
}
service层:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(long id){
return this.userMapper.selectByPrimaryKey(id);
}
}
controller层:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User queryById(@PathVariable Long id){
return userService.queryById(id);
}
}
自此所有的内容目录应该如下所示:
最后的网页呈现效果如下:
在完成了服务创建者的内容后,我们来尝试创建服务的调用者。这里具体的话就是指的是消费者或者客户了。
pom文件打包:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
实体类如下:
@Data
public class User {
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
// 备注
private String note;
}
controller层如下:
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{id}")
public User queryById(@PathVariable Long id){
String url = "HTTP://localhost:9000/user/" + id;
return restTemplate.getForObject(url, User.class);
}
}
到这里整个微服务模拟已经写完了。
然后服务调用者启动时应该同时打开服务提供者,后续模拟展示如下:
简单回顾前面的模拟过程:
user-service(服务提供者):对外提供了查询用户的接口。
consumer(服务调用者)::通过RestTemplate访问提供者的接口,完成通过id查询用户数据。
所以在基于spring boot构建的项目中,模拟过程存在很多问题:
所以基于以上内容,我们来讲一下面向服务架构(分布式架构)所要面临的问题,在如下都要完成实现:
服务的基本管理
1、自动发现——即自动的注册服务
2、实现动态的状态管理
3、实现动态路由——不产生硬编码
服务器实现负载均衡——完成高可用
服务器解决统一配置问题
服务器解决…
当然换句话说,也就是我后续会讲到spring cloud如何实现以上问题。后续的部分我会继续基于这些问题完成笔记的内容和分享。谢谢大家的阅读,还请大佬批评指正!