微服务入门学习

为什么需要微服务?

传统开发模式下,绝大部分的web应用都是采用单体架构的风格来进行构建的,这意味着web应用是作为单个可部署的软件制品进行交付的,所有的接口、业务逻辑、持久层都被打爆在一个web应用中,并且部署在一台服务器上,这种开发模式会带来诸多不便,多团队协同开发的成本极高。

传统开发方式

在这里插入图片描述

单体应用存在的问题

  1. 随着业务的发展,开发变得越来越复杂。
  2. 修改,新增某个功能,需要对整个系统进行测试,重新部署。
  3. 一个模块出现问题,很可能导致整个系统崩溃。
  4. 多个开发团队同时对数据进行管理,容易产生漏洞。
  5. 各个模块使用同一种技术进行开发,很难根据实际情况选择更合适的技术框架,局限性很大。
  6. 模块内容过于复杂,如果员工离职,可能需要很长时间才能完成工作交接。

分布式、集群

集群
  • 一台服务器无法负荷高并发的数据访问,那么就设置十台服务器分担压力,十台不行就设置一百 台。(物理层面)很多人干同一件事情,来分担压力
分布式
  • 将一个复杂的问题拆分成若干个简单的小问题,将一个大型的项目架构拆分成若干个微服务来协同完成。(软件设计层面)。将一个庞大的工作拆分成若干小步骤,分别由不同的人完成这些小步骤,最终将所有的结果进行大的需求。

微服务架构

在这里插入图片描述

微服务的优点

  1. 各个服务的开发、测试、部署都相互独立,比如用户服务就可以拆分作为一个单独的服务,而它的开发也不用依赖于其他服务,如果用户量很大,我们可以很容易的对其进行负载
  2. 当一个新的需求出现时,特别是在一个庞大的系统项目中,需要考虑各方面的问题,兼容性、影响度等,而使用微服务则可以直接跳过这些费时又烧脑的环节。
  3. 使用微服务将项目进行拆分之后,个服务之间就消除了诸多限制,只需要保证对外提供接口正常可用,至于使用什么语言、什么框架统统不用关心。

微服务的不足

  1. 微服务的拆分是基于业务的,不是随心所欲的,所以怎么拆分就是一个问题,给团队沟通带来了挑战
  2. 当服务调用需要使用某服务接口时,首先需要找到该服务的提供方,通常这种场景是跨部门的,有很大的沟通成本。同时,如果服务的提供方对某个接口进行了修改,也需要与各个服务调用方进行沟通
  3. 由于服务相互独立,他们数据也是独立的,当调用多规格服务接口同时进行操作时,保证各个服务的数据一致性也是一个问题

为什么选用Spring Cloud?

  1. spring cloud 完全基于spring boot ,服务嗲用方式也是基于REST API,整合了各种成熟的产品和架构,同时基于spring boot也使得整体的开发、重置、部署都特别方便
  2. spring 系列的产品功能齐全,简单好用,性能优越、文档规范等等,因此spring cloud 还是微服务架构中一个十分优越的实现方案

核心组件

在这里插入图片描述

服务治理 Eureka

服务治理的核心又分为三部分:服务提供者、服务消费者、注册中心
在分布式系统架构中,每个微服务启动时,将自己的信息存储在注册中心,叫做服务注册
服务消费者从注册中心获取服务提供者的网络信息,通过该信息调用服务,叫做服务发现

小结:服务提供者、服务消费者、注册中心,三个核心组件完成服务注册和服务发现,称为服务治理

Spring Cloud的服务治理使用Eureka来实现,Eureka是Netflix开源的基于REST的服务治理解决方案,Spring Cloud 集成了Eureka,提供服务注册和服务发现的功能,可以基于Spring Boot搭建的微服务应用轻松完成整合,开箱即用,Spring Cloud Eureka

Spring Cloud Eureka

  1. Eureka Server 注册中心
  2. Eureka Client 所有要注册的微服务通过Eureka Client连接到Eureka Server 完成注册

Eureka Server代码实现

  • 创建父类项目
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--解决JDK9以上没有JAXB API的问题-->
        <!--<dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>-->
    </dependencies>
    <!--引入SpringCloud的管理依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

一定要注意springboot版本问题 (TAT)

  • 在子类moudle中的pom.xml
<dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
           <version>2.0.2.RELEASE</version>
       </dependency>
   </dependencies>
  • 创建配置文件application.yml,添加Eureka Server相关配置
server:
  port: 8761
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8761/eureka/

属性说明
server.port注册中心启动的端口
eureka.client.register-with-eureka是否将当前Eureka Server服务作为客户端进行注册
eureka.client.fetch-registry是否获取其他Eureka Server服务的数据
eureka.client.service-url.defaultZone注册中心的访问地址

  • 创建启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

注解说明
@SpringBootApplication声明该类是Spring Boot的入口
@EnableEurekaServer声明该类是一个Eureka Server微服务,提供服务注册和服务发现功能,即注册中心

  • 启动注册中心,浏览器进入启动端口
    在这里插入图片描述

Eureka Client代码实现

  • 创建Moudule,pom.xml
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

创建配置文件application.yml,添加Eureka Client相关配置

server:
  port: 8010
spring:
  application:
    name: provider
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
    instance:
      prefer-ip-address: true

属性说明
spring.application.name当前服务在Eureka Server上注册的名称
eureka.client.service-url.defaultZone注册中心的地址
eureka.client.instance.prefer-ip-address是否将当前服务的IP注册到Eureka Server

  • 创建启动类
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

  • 启动Eureka Client可看到已经在注册中心注册
    在这里插入图片描述
  • 创建实体类 进行CRUD操作均可正常执行

RestTemplate的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值