架构师--SpringCloud学习笔记:一、微服务的演化过程

本系列博文为学习资料,是根据老师讲义,加上自己理解描述整理而成。如有不当之处希望不吝指正,持续更新改正。

1、架构演变过程

我们最先接触的单体架构,整个系统就只有一个工程,打包往往是打成了 war 包,然后部署 到单一 tomcat 上面,这种就是单体架构,如图:
在这里插入图片描述
假如系统按照功能划分了,商品模块,购物车模块,订单模块,物流模块等等模块。那么所 有模块都会在一个工程里面,这就是单体架构。

优点

  • 1、结构简单,部署简单
  • 2、所需的硬件资源少
  • 3、节省成本

缺点

  • 1、版本迭代慢,往往改动一个代码会影响全局
  • 2、不能满足一定并发的访问
  • 3、代码维护困难,所有代码在一个工程里面,存在被其他人修改的风险

随着业务的拓展,公司的发展,单体架构慢慢的不能满足我们的需求,我们需要对架构进行 变动,我们能够想到的最简单的办法就是加机器,对应用横向扩展。 如图:
在这里插入图片描述
这种架构貌似暂时解决了我们的问题,但是用户量慢慢增加后,我们只能通过横向加机器来 解决,还是会存在版本迭代慢,代码维护困难的问题。而且用户请求往往是读多写少的情况, 所以可能真正需要扩容的只是商品模块而已,而现在是整个工程都扩容了,这无形中是一种 资源的浪费,因为其他模块可能根本不需要扩容就可以满足需求。所以我们有必要对整个工 程按照模块进行拆分,拆分后的架构图如下:

在这里插入图片描述
模块拆分后,模块和模块之间是需要通过接口调用的方式进行通信,模块和模块之间通过分 流软件进行负载均衡。这个架构解决前面的资源浪费问题和代码管理问题,因为我们是对系 统拆分了,各个模块都有单独的工程,比如我修改商品模块,就不需要担心会不会影响购物 车模块。但是这种架构扩展非常麻烦,一旦需要横向加机器,或者减机器都需要修改 nginx 配置,一旦机器变多了以后,nginx 的配置量就是一个不能完成的工作。OK,这时候 SOA 服 务治理框架就应运而生,

注: SOA全英文是Service-Oriented Architecture,中文意思是中文面向服务编程,是一种思想,一种方法论,一种分布式的服务架构。
用途:SOA解决多服务凌乱问题,SOA架构解决数据服务的复杂程度,同时SOA又有一个名字,叫做服务治理。(百度解决此概念理解问题)

架构图如下:
在这里插入图片描述
基于注册中心的 SOA 框架,扩展是非常方便的,因为不需要维护分流工具,但我们启动应用的时候就会把服务通过 http 的方式注册到注册中心。
在 SOA 框架中一般会有三种角色:1、注册中心 2、服务提供方 3、服务消费方

在这里插入图片描述

  • 1、注册中心
    在注册中心维护了服务列表
  • 2、服务提供方
    服务提供方启动的时候会把自己注册到注册中心
  • 3、服务消费方
    服务消费方启动的时候,把获取注册中心的服务列表,然后调用的时候从这个服务列表中选择某一个去调用。

微服务工程的特点:

  • 1、扩展灵活
  • 2、每个应用都规模不大
  • 3、服务边界清晰,各司其职
  • 4、打包应用变多,往往需要借助 CI 持续集成工具

2、搭建简单的微服务工程

1、注册中心搭建

Springcloud 中,我们选择 eureka 作为注册中心,springcloud 工程是基于 springboot 工程的。pom.xml 中 jar 包依赖:

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

Springcloud 的版本

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

Springcloud 的依赖仓库导入

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Application.properties 配置文件

server.port=8763
eureka.instance.hostname=localhost

#是否注册到eureka
eureka.client.registerWithEureka=false
#是否从eureka中拉取注册信息
eureka.client.fetchRegistry=false
##暴露eureka服务的地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
#eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/,http://admin:admin@Eureka8761.com:8761/eureka/,http://admin:admin@Eureka8762.com:8762/eureka/

#自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除,默认为true
eureka.server.enable-self-preservation=false


#eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
eureka.server.eviction-interval-timer-in-ms=60000

配置文件属性后续会详解

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
//开启Eureka服务
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

2、服务提供方

Pom的jar包依赖,其他都跟eureka服务端是一样的,只是服务提供方要把服务注册到eureka 服务端,所以服务提供方就是 eureka 的客户端,所以需要导入 eureka 客户端的启动器。

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

bootstrap.properties

spring.application.name=rick-order
server.port=8084

#连接eureka服务端-格式-->http://username:password@localhost:port/eureka
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:8763/eureka/
#eureka.client.serviceUrl.defaultZone=http://localhost:8763/eureka/

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
//开启客户端
@EnableEurekaClient
public class RickOrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(RickOrderApplication.class, args);
    }
}

3、服务消费方

pom 和属性配置文件基本上差不多,消费要负责调用服务提供方,所以需要调用客户端

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
//开启Eureka客户端
@EnableEurekaClient
public class RickWebApplication {

    @Bean
    //负载均衡注解
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RickWebApplication.class, args);
    }
}

服务调用的时候就根据服务提供方的服务名称来调用的

import com.rick.demo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
public class UserServiceImp implements UserService {

    public static String SERVICE_NAME="rick-order";

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public String queryContents() {
        String result = restTemplate.getForObject("http://"+ SERVICE_NAME+"/queryUser",String.class);
        return result;
    }
}

服务提供方的名称,再加上服务提供方的接口名就可以完成调用了。 服务提供方和服务消费启动的时候都会往服务注册中心注册服务, eureka 服务端也可以通过 界面查看到服务注册情况:
在这里插入图片描述
这样的话,最简单的微服务就算搭建完成了。
文章附上老师的课堂代码。
https://download.csdn.net/download/keenstyle/12229334

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值