IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Cloud微服务架构基础内容?看这一篇就够啦! -> 正文阅读

[Java知识库]Spring Cloud微服务架构基础内容?看这一篇就够啦!

Spring Cloud微服务架构基础内容?看这一篇就够啦!

昨天讲完架构的演变迭代,以及微服务的各种服务传输发送的方式,由于个人的学习因素,我还是主要介绍微服务中使用Spring家族的内容。

1、Spring Cloud简介

Spring Cloud是Spring旗下的项目,其中Spring最擅长的就是集成,即一系列框架的有序结合。它会将很多非常棒的框架拿过来进行集成到自身的项目中去。

所以同理,Spring Cloud就是这样,将现在非常流行的技术整合到一起,实现了诸如:配置管理,服务发现,智能路 由,负载均衡,熔断器,控制总线,集群状态等等功能。

当然这些内容都是微服务后续内容所要提及的内容,所以这篇内容算是总的集合,为后续的内容打下理论基础。

1.1 组件架构

在这里我以个人的认识来展示Spring Cloud所要表达的基础架构部分,如下图:

在这里插入图片描述

附加(个人理解):首先用户将请求转发到网关通过调用网关传达服务,通过其中负载均衡方法(Ribbon),较为均衡的调用项目服务。在项目重构或者构建微服务时,势必要先到Eureka注册以完成——“什么样的服务需求来找什么样的服务”,并且后续进行服务调用。项目的配置服务甚至可以以远程Git创建仓库放置配置文件的方式,来完成项目的配置。

当然后面具体开发才能更详细的说明,这里不多啰嗦呵呵。

1.2 Spring Cloud版本

由于作者更加喜欢使用IDEA创建Maven项目开发,这势必要考虑打包依赖的管理部分。

有意思的是,Spring Cloud是以伦敦地铁站名字命名,这里网站找到的对应表整理如下:

rELEASE tRAINBoot Version
Hoxton2.2.x
Greenwich2.1.x
Finchley2.0.x
Edgware1.5.x
Dalston1.5.x

2、微服务场景模拟

这里是微服务场景的模拟,并不真正涉及到微服务本身的整体内容,所以看客老爷们就稍微浏览即可。

2.1 创建父工程

如果按照上图架构所表示微服务模拟,那么就要创建若干个微服务。这时候就要先创建父工程打包统一管理子模块的依赖版本

如下展示我的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>com.xaf</groupId>
    <artifactId>spring-cloud-project</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        <mapper.starter.version>2.1.5</mapper.starter.version>
        <mysql.version>5.1.46</mysql.version>
    </properties>
    <dependencyManagement>
    <dependencies>
        <!-- springCloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>${mapper.starter.version}</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
    </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

首先,我使用的是spring boot的2.1.x版本,就要使用greenwich(格林威治)版本的spring cloud。

其次,使用<packing>pom</packing>进行聚合打包。

2.2 创建数据库

这里我创建的数据表如下:

在这里插入图片描述

2.3 服务提供者(user-service)

在父工程选中创建模块后,添加依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>spring-cloud-project</artifactId>
        <groupId>com.xaf</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>

然后进行配置文件:

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);
    }
}

自此所有的内容目录应该如下所示:

在这里插入图片描述

最后的网页呈现效果如下:

在这里插入图片描述

2.4 服务调用者(consumer)

在完成了服务创建者的内容后,我们来尝试创建服务的调用者。这里具体的话就是指的是消费者或者客户了。

pom文件打包:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </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);
	}
}

到这里整个微服务模拟已经写完了。

然后服务调用者启动时应该同时打开服务提供者,后续模拟展示如下:

在这里插入图片描述

3、Spring Cloud模拟总结

简单回顾前面的模拟过程:

user-service(服务提供者):对外提供了查询用户的接口。

consumer(服务调用者)::通过RestTemplate访问提供者的接口,完成通过id查询用户数据。

所以在基于spring boot构建的项目中,模拟过程存在很多问题:

  1. 首先在consumer很直接的进行硬编码,在真正开发上肯定不利于代码维护。
  2. 硬编码后,还要记住服务提供方,即user-service的接口地址,如果有出现端口变更等情况还要对consumer进行变更,否则地址会失效。
  3. 而服务提供者user-service在进行服务时,只能出现1台服务;即使能够形成集群结构,也要通过自己实现负载均衡算法完成高可用性的目标。
  4. consumer完全不知道user-service的当前状态(除了user-service未启动拒绝连接以外),完全没有服务提供方的详情。

所以基于以上内容,我们来讲一下面向服务架构(分布式架构)所要面临的问题,在如下都要完成实现:

  • 服务的基本管理

    1、自动发现——即自动的注册服务

    2、实现动态的状态管理

    3、实现动态路由——不产生硬编码

  • 服务器实现负载均衡——完成高可用

  • 服务器解决统一配置问题

  • 服务器解决…

当然换句话说,也就是我后续会讲到spring cloud如何实现以上问题。后续的部分我会继续基于这些问题完成笔记的内容和分享。谢谢大家的阅读,还请大佬批评指正!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-27 12:42:26  更:2021-10-27 12:42:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:01:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码