5.Spring Cloud快速入门

5.Spring Cloud快速入门

​ Ø微服务是一种架构方式,最终肯定需要技术架构去实施。

​ Ø微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?

​ Ø 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。

​ Ø 技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑。

​ Ø 群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。

​ Ø 使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架搭建

5.1简介

SpringCloud是Spring旗下的项目之一

https://spring.io/projects/spring-cloud

Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

Netflix:微服务大规模的应用,在技术上毫无保留的把一整套微服务架构核心技术栈开源了出来,叫做Netflix OSS

​ Ø Eureka:注册中心

​ Ø Zuul:服务网关

​ Ø Ribbon:负载均衡

​ Ø Feign:服务调用

​ Ø Hystix:熔断器

以上只是其中一部分,架构图:

在这里插入图片描述

5.2 版本

​ SpringCloud的版本命名比较特殊,因为它不是一个组件,而是许多组件的集合,它的命名是以A到Z的为首字母的一些单词组成,也叫Train Version(火车头命名方式),每个版本是伦敦地铁站的名字,最新稳定版 Hoxton.SR7

在这里插入图片描述

我们在项目中,目前使用的版本

https://docs.spring.io/spring-cloud/docs/Hoxton.SR7/reference/html/

在这里插入图片描述

6微服务场景模拟

首先,我们需要模拟一个服务调用的场景。方便后面学习微服务架构

6.1创建父工程(project)

6.1.1 创建maven的project

在这里插入图片描述

6.1.2 修改pom文件

修改spring-cloud-learn/pom.xml

<?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>edu.xja</groupId>
    <artifactId>spring-cloud-learn</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR7</spring-cloud.version>
        <mysql.version>5.1.49</mysql.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <!--lombok所有的子工程都有,而下面的需要在子工程中手动添加。-->
    <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>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

6.2服务提供者(module)

新建模块microservice-provider-user

在这里插入图片描述

选择刚创建的父工程cloud

在这里插入图片描述

然后Next

在这里插入图片描述

创建成功

在这里插入图片描述

microservice-provider-user/pom.xml文件中加入依赖

<dependencies>
    <!--支持全栈web开发,里面包括了Tomcat和Spring-webmvc-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- springboot 测试 依赖jar -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- mybatis 依赖jar  这块可以挪到父工程中定义版本-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.3</version>
    </dependency>
    <!-- mysql 依赖jar -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
<!-- swagger 依赖jar -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

</dependencies>

然后将之前创建的工程provider-user中的src拷贝过来,其中的src就是你之前写好的springboot项目

如果有需要修改的地方修改一下

启动测试

http://localhost:8888/user/3

在这里插入图片描述

6.3服务消费者(module)

创建module工程microservice-consumer-movie

在这里插入图片描述

consumer和provider是在同一级目录下,都在spring-cloud-learn父工程下。

在这里插入图片描述

创建成功后,我们看下spring-cloud-learn父工程的pom.xml

spring-cloud-learn/pom.xml

在这里插入图片描述

microservice-consumer-movie/pom.xml 加入依赖

<dependencies>
    <!--支持全栈web开发,里面包括了Tomcat和Spring-webmvc-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- springboot 测试 依赖jar -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

拷贝之前consumer-movie-resttemplate工程中src文件夹

添加controller

package edu.xja.controller;

import edu.xja.vo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@RequestMapping("/consumer")
@Slf4j
public class MovieController {
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/user/{id}")
    public User findById(@PathVariable Integer id) {
        return restTemplate.getForObject("http://localhost:8888/user/" + id, User.class);
    }

}

可以实验一下使用mvn编译多个工程

mvn clean package -Dmaven.test.skip=true

启动ConsumerApplication,老版本会出现提示如下图,新版本idea在view->tool windows->services中,或者右下角提示

在这里插入图片描述

在Dashboard中可以同时监控多个项目

在这里插入图片描述

启动后如下:

在这里插入图片描述

http://localhost:8080/consumer/user/3

在这里插入图片描述

小结:

provider:一个提供根据id查询用户的微服务

consumer:一个服务调用者,通过RestTemplate远程调用provider中的 UserController类中的getById(Long id)

在这里插入图片描述

存在什么问题?

在consumer中,我们把url地址硬编码到了代码中,不方便后期维护

consumer需要记忆provider的地址,如果出现变更,可能得不到通知地址将失效

consumer不清楚provider的状态,服务宕机也不知道。

provider只有1台服务,不具备高可用性

其实上面说的问题,概括一下就是分布式服务必然要面临的问题:

服务管理

​ Ø 如何自动注册和发现

​ Ø 如何实现状态监管

​ Ø 如何实现动态路由

​ Ø 服务如何实现负载均衡

​ Ø 服务如何解决容灾问题

​ Ø 服务如何实现统一配置

-1602570682310)]

存在什么问题?

在consumer中,我们把url地址硬编码到了代码中,不方便后期维护

consumer需要记忆provider的地址,如果出现变更,可能得不到通知地址将失效

consumer不清楚provider的状态,服务宕机也不知道。

provider只有1台服务,不具备高可用性

其实上面说的问题,概括一下就是分布式服务必然要面临的问题:

服务管理

​ Ø 如何自动注册和发现

​ Ø 如何实现状态监管

​ Ø 如何实现动态路由

​ Ø 服务如何实现负载均衡

​ Ø 服务如何解决容灾问题

​ Ø 服务如何实现统一配置

以上的问题,都将在SpringCloud中得到答案。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值