小白来敲门springcloud[微服务](上)

一、引入微服务

1、微服务的特点 - 化整为零
  • 小型化 - 只做好一件事

  • 自治理 - 高内聚/低耦合

  • 扁平化 - 不要随意混搭

  • 轻量级设计 - Http-Restful API

  • 渐进式设计 - 业务驱动模式,循序渐进迭代

在这里插入图片描述

话不多说,基础知识 网上一大堆,接下来入门微服务,手动搭建及排坑。

二、从Eureka开始循序渐进

1、要先把eureka玩明白了,首先介绍下我的基本环境
//作为参考
idea
jdk 1.8
springboot 2.5.3
springcloud 2020.0.3
maven 3.5
2、简单介绍Eureka(注册中心)

简单两句话:注册中心是分布式架构中最重要的部分,用于服务的注册与发现。所有的微服务必须在注册中心中登记才能被使用。

  • 新建服务端项目,选择 Spring Initializr
  • 下一步,起项目包名,java环境
  • 【重要】在这里插入图片描述

至此项目建立成功。

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.springcloud</groupId>
    <artifactId>registry</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>registry</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <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>

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

</project>

  • 修改配置文件application.properties
# 应用名称&&注册中心的id
spring.application.name=registry
# 建议与eureka监听端口一致
server.port=8761
#registry即是客户端也是服务端,在这里将客户端注释掉
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
  • 修改启动类,添加@EnableEurekaServer //启动注册中心在这里插入图片描述

访问localhost;8761,如果不添加配置中对客户端的注释,就会出现以下的REGISTRY客户端
在这里插入图片描述

3、Eureka Client注册微服务

在这里插入图片描述
[ 1 ] 新建客户端项目,选择 Spring Initializr
[ 2 ] 选择web,需要注册服务在这里插入图片描述

[ 3 ] eureka客户端在这里插入图片描述

[ 4 ] 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.springcloud</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>client</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <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>

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

</project>

[ 5 ] 修改启动类,加注解开开关

 @EnableEurekaClient //开启客户端,在启动类添加

[ 6 ] ​ 新建客户端controller

 @Controller
 public class clientController {
 
     @Value("${server.port}")
     private String port;
     
     @GetMapping("/msg")
     @ResponseBody //返回数据json化
     public String msg(){
         return "hello IT散记"+port;
     }
 }

[ 7 ] 配置文件 application.properties

spring.application.name=client
# 客户端的负载均衡格式
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

本项目结构如下:

在这里插入图片描述

执行后访问localhost:8761 可以看到注册的客户端,名字同配置文件中的name

在这里插入图片描述

每30s会发送心跳包,检查注册信息,实时更新client。

有小伙伴注意到上述的配置中的负载均衡 ,考虑一下 实际使用中有多个服务,也就是客户端 都注册到rureka注册中心的情况,还有为了保证高可用,设计多个server端进行配置。接下来带你研究:

4、Eureka 多Client && 多server
(1) 增加服务端

在这里插入图片描述

Erueka即是客户端 也是客户端,添加两个注册端副本 见下图

在这里插入图片描述

非常简单的哈 ,增加端口8762的服务。

#注意:启动8762的服务时候注册中心地址设置8761端口,相似,启动8761的服务时候注册中心地址设置8762端口
eureka.client.service-url.defaultZone=http://localhost:端口/eureka

访问localhost:8761\8762 ,两个地址均可看到已注册的客户端。

在这里插入图片描述

在客户端中可以定义多个Eureka注册中心,Eyreka client运行时会按前后顺序自动选择

这种在客户端选择注册中心的机制,我愿称之为客户端负载均衡。

(2) 增加客户端

在这里插入图片描述

添加两个client不同端口:-Dserver.port=8000,8001

访问localhost:8761

在这里插入图片描述

访问localhost:8000(8001)/msg

在这里插入图片描述

---------可是做到这发现没啥用啊,还是得访问业务的ip加对应端口进行访问,微服务操作了个寂寞。

莫慌,接下来引入网关 来解决这个问题

三、网关组件zuul

丑图镇楼

在这里插入图片描述

1、新建Gateway项目
  • —直接跳到选择依赖这一步,(记得选上web依赖,因为需要注册服务嘛)。如果你是springboot2.3以后的 比如我的2.5 打开是这个样子
  • 在这里插入图片描述

天哪,默认都是gateway了 ,技术一直在前进,无奈我看的教程还是讲zuul的。为了能把项目跑下来,先研究zuul网关,上网查阅后,我选择用springboot 2.0.1.RELEASE 以及springcloud Finchley.RELEASE跑起来了,适合自己的电脑能跑起来才是最好的。

SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误,比如eureka注册了结果找不到服务类啊,比如某些jar导入不进来啊,等等这些错误。找了一份比较老旧的参考一下,自行官网查阅即可。

Spring BootSpring Cloud
1.5.2.RELEASEDalston.RC1
1.5.9.RELEASEEdgware.RELEASE
2.0.2.RELEASEFinchley.BUILD-SNAPSHOT
2.0.3.RELEASEFinchley.RELEASE
2.1.0.RELEASE-2.1.14.RELEASEGreenwich.SR5
2.2.0.M4Hoxton.SR4

我的网关项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.springcloud</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--服务网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <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>

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

</project>

如果你的项目起来并不报错了,来进行下一步

  • 在GatewayApplication中 增加注解

    @EnableEurekaClient
    @EnableZuulProxy //启动路由服务
    
  • 配置文件application.yml (和properties一样用)

spring:
  application:
    name: gateway
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 9000

运行项目,观察注册中心

在这里插入图片描述

已经注册上了,从此后所有的服务都会走9000端口进行访问,zuul访问规则:

http://xxxx:xx/service-id/...  //service-id 就是注册的客户端名字

在这里插入图片描述

因为新建客户端时候已经启动了 8000以及8001两个端口,在controller中我们编写了返回相应端口,也就是为了验证这一步的服务转发,即多次访问上图中我的地址,会去访问8000及8001两个端口的服务。可以自行尝试。

同理增加8003…等端口的服务只需要添加配置,就会自动注册到架构中来,可见微服务下水平业务的扩展,增加一个新应用多容易,只需要登记一下就好了。

此时如果感觉地址中暴露的client字段还不够友好,那么可以添加配置文件

zuul:
  routes:
    client: /c/**       #c就是你想替换的名字,**代表所有
2、入门一阶段结语

开发中定义不同的客户端名字进行开发,最后使用zuul进行统一路由就好了。zuul的功能还很强大,(请求拦截、跨域访问、、)咱们遇到再说

至此是不是有一点点了解了呢,建议理论知识自行查阅补充,我这里跟着使用来走一遍,接下来就是 拿一个小项目,从最初的数据库设计,架构模块的微服务模式划分开始走起,实际应用到springcloud。

在这里插入图片描述

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT散记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值