Spring Cloud-初探微服务

快来打我* 2022-05-25 11:20 237阅读 0赞

文章目录

  • Spring Cloud-初探微服务
        • 传统服务架构
        • 分布式项目架构
        • 项目集群
        • RPC远程调用
        • restful
        • soap
        • rpc
        • rpc远程调用框架
        • 面型服务架构SOA
        • 1.微服务架构
          • 1.1 什么是微服务架构
          • 1.2 SOA架构与微服务架构区别
          • 1.3 spring cloud
          • 1.4 服务提供者与消费关系
          • 1.5 spring cloud 解决了什么问题
        • 2.微服务简单模拟
          • 2.1 首先构建一个maven项目
            • pom
          • 2.2 构建服务提供者子项目 provider-user
            • pom.xml
            • User.java
            • UserController.java
            • application.yml
            • UserApp.java
          • 2.3 构建服务消费者子项目 consumer-order
            • pom.xml
            • User.java
            • OrderController.java
            • application.yml
            • Order.java

Spring Cloud-初探微服务

 在接触微服务之前首先梳理下以往项目的架构和一些相关技术点
这里写图片描述

传统服务架构

 传统项目分为三层架构,将业务逻辑层、数据库访问层、控制层放入在一个项目中。
 优点:适合于个人或者小团队开发,不适合大团队开发。

分布式项目架构

 根据业务需求进行拆分成N个子系统,多个子系统相互协作才能完成业务流程子系统之间通讯,其中使用RPC等远程通讯技术。
 相对于传统服务架构,分布式服务架构的优点:

  1. 拆分模块,利用接口通信,降低模块之间的耦合度。
  2. 将一个项目拆分成若干个子项目,不同的开发人员负责开发不同的子项目。
  3. 新增功能时只需要增加一个子项目,调用其它系统的接口就可以。
  4. 可以灵活的进行分布式部署。

 当然有优点就有缺点:

  1. 系统之间交互需要使用远程通信,接口开发增加工作量。
  2. 各个模块有一些通用的业务逻辑无法共用。 为了解决分布式架构的缺点,引入了soa架构,SOA:Service Oriented Architecture面向服务的架构。 就是将工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。 表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。

项目集群

 多台服务器部署相同应用构成一个集群
 作用:通过负载均衡设备共同对外提供服务

RPC远程调用

 RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。
 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。
 比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决

restful

 restful是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 restful架构或服务。

soap

 soap简单对象访问协议是一种数据交换协议规范, 是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。soap基于xml并封装成了符合http协议,因此,它符合任何路由器、防火墙或代理服务器的要求。soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。

rpc

 RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。 RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式) RPC在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

rpc远程调用框架

  1. RMI实现
     利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列化。
  2. Hessian
     是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。基于HTTP协议,采用二进制编解码。
  3. thrift
     是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
  4. SpringCloud
     为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
  5. Dubbo
     是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。

面型服务架构SOA

 业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力 通过服务的组合和编排来实现上层的业务流程
 作用:简化维护,降低整体风险,伸缩灵活

1.微服务架构

这里写图片描述

1.1 什么是微服务架构

 了解了以上概念现在来介绍下什么是微服务架构,微服务架构设计理念是各服务之间相互隔离-分布式也是隔离,自治-分布式
依赖整体组合、单一职责、边界、异步通信、独立部署等
 作用:各服务可独立应用,组合服务也可系统应用(巨石应用[monolith]的简化实现策略-平台思想)

1.2 SOA架构与微服务架构区别

 SOA架构主要针对企业级、采用ESB服务(ESB企业服务总线),非常重,需要序列化和反序列化,采用XML格式传输。
微服务架构主要互联网公司,轻量级、小巧,独立运行,基于Http+Rest+JSON格式传输。
 ESB也可以说是传统中间件技术与XML、Web服务等技术相互结合的产物。

1.3 spring cloud

 SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、负载均衡、
微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring
cloud是基于Springboot的,所以需要开发中对Springboot有一定的了解。

1.4 服务提供者与消费关系

 服务提供者:提供服务被人调用
 消费者:调用别人服务

1.5 spring cloud 解决了什么问题

 配置管理、服务发现(注册eureka、zookeeper)、服务注册、断路器、路由策略、负载均衡、全局锁、分布式会话、客户端调用、接口网关(ZUUL)、服务管理系统等

2.微服务简单模拟

2.1 首先构建一个maven项目
pom
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.ithzk.spring.cloud</groupId>
  5. <artifactId>SpringCloud_Demo</artifactId>
  6. <packaging>pom</packaging>
  7. <version>1.0-SNAPSHOT</version>
  8. <!--将当前项目申明为spring boot项目-->
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>1.5.10.RELEASE</version>
  13. </parent>
  14. <modules>
  15. <module>consumer-order</module>
  16. <module>provider-user</module>
  17. </modules>
  18. <name>SpringCloud_Demo</name>
  19. <!-- FIXME change it to the project's website -->
  20. <url>http://www.example.com</url>
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <maven.compiler.source>1.7</maven.compiler.source>
  24. <maven.compiler.target>1.7</maven.compiler.target>
  25. </properties>
  26. <dependencies>
  27. <dependency>
  28. <groupId>junit</groupId>
  29. <artifactId>junit</artifactId>
  30. <version>4.11</version>
  31. <scope>test</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>ch.qos.logback</groupId>
  35. <artifactId>logback-core</artifactId>
  36. <version>1.2.3</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>ch.qos.logback</groupId>
  40. <artifactId>logback-classic</artifactId>
  41. <version>1.2.3</version>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
  46. <plugins>
  47. <plugin>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-maven-plugin</artifactId>
  50. </plugin>
  51. <plugin>
  52. <artifactId>maven-clean-plugin</artifactId>
  53. <version>3.0.0</version>
  54. </plugin>
  55. <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
  56. <plugin>
  57. <artifactId>maven-resources-plugin</artifactId>
  58. <version>3.0.2</version>
  59. </plugin>
  60. <plugin>
  61. <artifactId>maven-compiler-plugin</artifactId>
  62. <version>3.7.0</version>
  63. </plugin>
  64. <plugin>
  65. <artifactId>maven-surefire-plugin</artifactId>
  66. <version>2.20.1</version>
  67. </plugin>
  68. <plugin>
  69. <artifactId>maven-jar-plugin</artifactId>
  70. <version>3.0.2</version>
  71. </plugin>
  72. <plugin>
  73. <artifactId>maven-install-plugin</artifactId>
  74. <version>2.5.2</version>
  75. </plugin>
  76. <plugin>
  77. <artifactId>maven-deploy-plugin</artifactId>
  78. <version>2.8.2</version>
  79. </plugin>
  80. </plugins>
  81. </pluginManagement>
  82. </build>
  83. </project>
2.2 构建服务提供者子项目 provider-user
pom.xml
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <version>1.4.7.RELEASE</version>
  5. </dependency>
User.java
  1. package com.ithzk.spring.cloud.entity;
  2. /** * @author hzk * @date 2018/5/13 */
  3. public class User {
  4. private Integer id;
  5. private String name;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public Integer getAge() {
  20. return age;
  21. }
  22. public void setAge(Integer age) {
  23. this.age = age;
  24. }
  25. public User(Integer id, String name, Integer age) {
  26. this.id = id;
  27. this.name = name;
  28. this.age = age;
  29. }
  30. public User() {
  31. }
  32. }
UserController.java
  1. package com.ithzk.spring.cloud.controller;
  2. import com.ithzk.spring.cloud.entity.User;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RestController;
  6. /** * @author hzk * @date 2018/5/13 */
  7. @RestController("/")
  8. public class UserController {
  9. @GetMapping("/user/{id}")
  10. public User getUser(@PathVariable Integer id){
  11. return new User(id,"zs",20);
  12. }
  13. }
application.yml
  1. server:
  2. port: 7900 #程序启动后的端口,也就是tomcat的端口,可自定义
  3. spring:
  4. application:
  5. name: provider-user
UserApp.java
  1. package com.ithzk.spring.cloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /** * Hello world! * */
  5. @SpringBootApplication
  6. public class UserApp {
  7. public static void main(String[] args )
  8. {
  9. SpringApplication.run(UserApp.class);
  10. }
  11. }

 此时通过http://localhost:7900/user/xx 可以访问接口获取json格式数据

2.3 构建服务消费者子项目 consumer-order
pom.xml
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <version>1.4.7.RELEASE</version>
  5. </dependency>
User.java
  1. package com.ithzk.spring.cloud.entity;
  2. /** * @author hzk * @date 2018/5/13 */
  3. public class User {
  4. private Integer id;
  5. private String name;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public Integer getAge() {
  20. return age;
  21. }
  22. public void setAge(Integer age) {
  23. this.age = age;
  24. }
  25. public User(Integer id, String name, Integer age) {
  26. this.id = id;
  27. this.name = name;
  28. this.age = age;
  29. }
  30. public User() {
  31. }
  32. }
OrderController.java
  1. package com.ithzk.spring.cloud.controller;
  2. import com.ithzk.spring.cloud.entity.User;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. /** * @author hzk * @date 2018/5/13 */
  10. @RestController
  11. public class OrderController {
  12. //spring 提供用于访问rest接口的模板对象
  13. @Autowired
  14. private RestTemplate restTemplate;
  15. @Value("${user.url}")
  16. private String url;
  17. @GetMapping("/order/{id}")
  18. public User getOrder(@PathVariable Integer id){
  19. //访问提供者 获取数据 通过rest访问获取的json数据转换为的User对象
  20. User user = restTemplate.getForObject(url + id, User.class);
  21. return user;
  22. }
  23. }
application.yml
  1. server:
  2. port: 8900
  3. spring:
  4. application:
  5. name: consumer-order
  6. user:
  7. url: http://localhost:7900/user/
Order.java
  1. package com.ithzk.spring.cloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.web.client.RestTemplate;
  6. /** * Hello world! * */
  7. @SpringBootApplication
  8. public class OrderApp {
  9. //相当于xml中的bean标签 用于调用当前方法获取到指定的对象
  10. @Bean
  11. public RestTemplate getRestTemplate(){
  12. return new RestTemplate();
  13. }
  14. public static void main( String[] args )
  15. {
  16. SpringApplication.run(OrderApp.class);
  17. }
  18. }

 此时通过http://localhost:8900/order/xx 可以访问接口,接口转而请求http://localhost:7900/user/x获取json格式数据,这就是简单的微服务样例,之后博客中会开始进入spring-cloud的应用

发表评论

表情:
评论列表 (有 0 条评论,237人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务初探

    一、微服务简介 微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个

    相关 服务Spring Cloud学习

    Spring Cloud是一个基于Springboot实现的微服务架构开发工具。它为微服务架构中设计的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策...