SpringCloud学习笔记<1>

一、入门

1.maven下载jar包太慢?

maven下载jar包太慢?

因为从中央仓库下载默认使用的国外的镜像下载,速度比较慢,我们可以把镜像修改为从阿里云下载,这样比较快

方法,打开maven在本地的位置,找到conf文件夹下的setting,xml打开,在mirrors标签中将下面代码复制进去

<mirror>

    <id>nexus-aliyun</id>

    <mirrorOf>*</mirrorOf>

    <name>Nexus aliyun</name>

    <url>http://maven.aliyun.com/nexus/content/groups/public</url>

</mirror>

2.如何在官网下载旧版本的maven?

在这里插入图片描述

src和bin的区别?

src版本包含源码,主要给高级开发人员准备,可以去修改其中的源码改变或扩展功能。
bin版本主要是一般开发人员或使用者准备,只需要使用其固化功能即可。

3.父工程pom、yml?

properties 里的版本、也就是

例如下面的${mysql.version} 就是8.0.18
properties中

<properties>

    <java.version>7</java.version>

</properties>


<properties>

      <maven.compiler.source>7</maven.compiler.source>

      <maven.compiler.target>7</maven.compiler.target>

</properties>

产生的效果完全一致,就是选择java的版本

在这里插入图片描述

compiled 已编译的

compatible 兼容的

groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
  groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artifactId是tomcat。
  比如我创建一个项目,我一般会将groupId设置为cn.gbs,cn表示域为中国,gbs是我个人姓名缩写,artifactId设置为testProj,表示你这个项目的名称是testProj,依照这个设置,你的包结构最好是cn.gbs.testProj打头的,如果有个StudentDao,它的全路径就是cn.gbs.testProj.dao.StudentDao

artifact 手工的

是父工程pom才有的依赖标签

scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。
scope具体含义如下:

compile(默认)
含义:compile 是默认值,如果没有指定 scope 值,该元素的默认值为 compile。被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。打包的时候通常会包含被依赖项目。

provided
含义:被依赖项目理论上可以参与编译、测试、运行等阶段,相当于compile,但是再打包阶段做了exclude的动作。
适用场景:例如, 如果我们在开发一个web 应用,在编译时我们需要依赖 servlet-api.jar,但是在运行时我们不需要该 jar 包,因为这个 jar 包已由应用服务器提供,此时我们需要使用 provided 进行范围修饰。

runtime
含义:表示被依赖项目无需参与项目的编译,但是会参与到项目的测试和运行。与compile相比,被依赖项目无需参与项目的编译。
适用场景:例如,在编译的时候我们不需要 JDBC API 的 jar 包,而在运行的时候我们才需要 JDBC 驱动包。

test
含义: 表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。
适用场景:例如,Junit 测试。

system
含义:system 元素与 provided 元素类似,但是被依赖项不会从 maven 仓库中查找,而是从本地系统中获取,systemPath 元素用于制定本地系统中 jar 文件的路径。

import
它只使用在中,表示从其它的pom中导入dependency的配置,例如 (B项目导入A项目中的包配置):

继承一个父模块,然后再引入相应的依赖。
假如说,我不想继承,或者我想继承多个,怎么做?

我们知道Maven的继承和Java的继承一样,是无法实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么按照我们之前的做法,这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,那就不可能了,import scope依赖能解决这个问题。你可以把dependencyManagement放到单独的专门用来管理依赖的pom中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。

注意:import scope只能用在dependencyManagement里面

这样,父模块的pom就会非常干净,由专门的packaging为pom来管理依赖,也契合的面向对象设计中的单一职责原则。此外,我们还能够创建多个这样的依赖管理pom,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。

这样配置的话,自己的项目里面就不需要继承SpringBoot的module了,而可以继承自己项目的module了。

scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是:
当C是test或者provided时,C直接被丢弃,A不依赖C;
否则A依赖C,C的scope继承于B的scope

父工程pom举例:

<!--统一管理jar包和版本-->
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <junit.version>4.12</junit.version>
  <log4j.version>1.2.17</log4j.version>
  <lombok.version>1.16.18</lombok.version>
  <mysql.version>8.0.18</mysql.version>
  <druid.verison>1.1.16</druid.verison>
  <mybatis.spring.boot.verison>1.3.0</mybatis.spring.boot.verison>
</properties>

<!--子模块继承之后,提供作用:锁定版本+子module不用写groupId和version-->
<dependencyManagement>
  <dependencies>
    <!--spring boot 2.2.2-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.2.2.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!--spring cloud Hoxton.SR1-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Hoxton.SR1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!--spring cloud alibaba 2.1.0.RELEASE-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!-- MySql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <!-- Druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>${druid.verison}</version>
    </dependency>
    <!-- mybatis-springboot整合 -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>${mybatis.spring.boot.verison}</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
    </dependency>
    <!--junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>
    <!-- log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>

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

  </dependencies>
</dependencyManagement>
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <fork>true</fork>
        <addResources>true</addResources>
      </configuration>
        <version>2.2.2.RELEASE</version>
    </plugin>
  </plugins>
</build>
</project>

yml文件:

server:
   port: 8001
spring:
   application:
      name: cloud-payment-service
   datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql驱动类
    driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=
            UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password:
mybatis:
    mapperLocations: classpath:mapper/*.xml
       type-aliases-package: com.gbs.springcloud.entities

4.@data @AllArgsconstructor @NoArgsconstructor 注解失效解决方法

在这里插入图片描述

安装插件

yml文件中不能有tab,必须只用空格

yml文件语法严格,父类必须比子类靠左,不然识别不出来
在这里插入图片描述

5.配置数据源?

在这里插入图片描述
在这里插入图片描述

6.Mybatis中javaType和jdbcType对应关系

JDBCType JavaType

CHAR                String

VARCHAR             String

LONGVARCHAR         String

NUMERIC             java.math.BigDecimal

DECIMAL             java.math.BigDecimal

BIT                 boolean

BOOLEAN             boolean

TINYINT             byte

SMALLINT            short

INTEGER             int

BIGINT              long

REAL                float

FLOAT               double

DOUBLE              double

BINARY              byte[]

VARBINARY           byte[]

LONGVARBINARY               byte[]

DATE                java.sql.Date

TIME                java.sql.Time

TIMEStamP           java.sql.Timestamp

CLOB                Clob

BLOB                Blob

ARRAY               Array

DISTINCT            mapping of underlying type

STRUCT              Struct

REF                 Ref

DATALINK            java.net.URL[color=red][/color]

7.加时区?

url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

8.开启热部署?

(父pom和子pom上面已有)
在这里插入图片描述
在这里插入图片描述

快捷键ctrl shift alt /

消费者端口选80,因为80端口是默认的,写网址不用写端口

9.开启run dashboard?

在这里插入图片描述
在这里插入图片描述

10.工程重构?

也就是把其他微服务里的共有部分提取出来、写成自己的依赖

<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
    <groupId>com.gbs.springcloud</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
</dependency>

11.RestTemplate?

Spring用于同步客户端HTTP访问的中心类。它简化了与HTTP服务器的通信,并执行RESTful原则。它处理HTTP连接,使应用程序代码提供URL,使用可能的模板变量,并提取结果。
在这里插入图片描述

使用方法:
在这里插入图片描述

二、Eureka入驻

功能部件框图:
在这里插入图片描述

1.入驻Eureka步骤

Eureka Server 运行界面

pom文件需要引入这段依赖,否则会报错
在这里插入图片描述

在这里插入图片描述

8001 Payment入驻Eureka步骤

  1. payment8001

POM文件引入新的 eureka-client依赖

在这里插入图片描述

  1. yml文件中配置开启注册
    在这里插入图片描述

  2. 主启动加新的注解

在这里插入图片描述

服务注册成功:

在这里插入图片描述

2.Eureka服务器集群配置

在这里插入图片描述

两个工程文件除application.yml外一模一样

Eureka 7002的yml文件

在这里插入图片描述

Eureka 7001的yml文件

在这里插入图片描述

两个服务相互守望

本地hosts文件中添加如下配置

在这里插入图片描述

支付订单模块和消费者80的yml
在这里插入图片描述

成功示意图:

7001

在这里插入图片描述

7002
在这里插入图片描述

支付服务提供者8001集群环境构建:

首先创建一个和payment8001完全一致的payment8002

在这里插入图片描述

通过在controller中返回本服务的端口号来判断消费者80端口调用的是payment服务的哪一个端口
在这里插入图片描述

消费者80端口的controller调用的服务url不能写死,否则永远只调用固定的端口。
在这里插入图片描述

url改变写法,把区别条件由ip端口号变为微服务的名称。

同时通过@LoadBalanced 赋予RestTemplate负载均衡的能力
在这里插入图片描述

eureka 7001服务下已注册成功两个CLOUD-PAYMENT-SERVICE服务,端口号分别是8001,8002
在这里插入图片描述

此时采用localhost/consumer/payment/get/2

即消费者80端口(80端口默认浏览器端口可省略不写),访问payment/get、

可以调到8001和8002两个服务
在这里插入图片描述

在这里插入图片描述

url写死和写活的两种写法对比:

两种访问微服务的途径:

1、iP+端口号

2、微服务名称
在这里插入图片描述

3.IP地址的显示和主机信息的完善

在这里插入图片描述

效果图:

在这里插入图片描述

这样配置之后更规范也更便于查找错误

4.服务发现discovery

服务发现discovery、对外暴露一个接口、可以通过该接口获取到该服务的基本信息

注入discoverClient类
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行效果:控制台打印同名服务
在这里插入图片描述

在这里插入图片描述

5.自我保护机制

某时刻某一微服务不可用了,Eureka不会立即清理,而是依旧对该微服务的信息进行保存。因为Eureka管理微服务是会和微服务保持心跳连接的。

自我保护机制可以在配置文件里关闭

三、zookeeper入驻(linux操作系统)

1.linux安装zookeeper步骤

检查java版本
在这里插入图片描述

linux操作系统下下载zookeeper3.4.9
在这里插入图片描述

tar -zxvf zookeeper-3.4.12.tar.gz 解压

进入bin目录下

关闭防火墙
在这里插入图片描述

ifconfig 查虚拟机ip
在这里插入图片描述

与本机windows操作系统ping通

2.idea创建新module

创建新module payment8004

POM文件添加zookeeper的依赖
在这里插入图片描述

在这里插入图片描述

小BUG:

yml文件没有变出小叶子,尝试重新导入pom文件

在这里插入图片描述

jar包冲突,引入新的与centOS系统中一样版本的zookeeper 3.4.9
在这里插入图片描述

controller中调用/payment/zk 即可查看到端口和流水号

在这里插入图片描述

如下这个文件原本是zoo_sample,要改名为zoo才能启动zookeeper成功
在这里插入图片描述

3.调用成功

zookeeper启动成功后, 启动微服务8004

然后进入命令行界面输入ls / 此时可看到注册服务多了一个services

进入services 可以看到payment已注册成功

在这里插入图片描述

浏览器端查看端口号

在这里插入图片描述

zookeeper临时节点 心跳维持结束后,对应的注册信息也会消失

新建module
在这里插入图片描述
在这里插入图片描述

与order80 module的区别除了名称和yml文件其他基本一样

注册80消费者成功

在这里插入图片描述

linux关闭zookeeper

./zkServer.sh stop

四、consul作为服务注册中心

1.下载安装

官网下载consul1.6.1

下载完成后解压双击exe文件运行

后打开命令窗口
在这里插入图片描述

打开consul的web页面、此时还没有注册的服务

在这里插入图片描述

payment8006的yml

在这里插入图片描述

新增消费者80端口注册consul

pom中添加consul依赖

yml文件中增加consul配置
在这里插入图片描述

url访问服务也成功

在这里插入图片描述

三个服务中心的异同:
在这里插入图片描述

CAP理论:

C:consistency 一致性

A:available 可用性

P:partition tolerance 分区容错性

A代表数据可以有一定的差错,C表示数据如果由差错就马上报错

Eurake是ap zookeeper和consul是CP

五、Ribbon

1.ribbon入驻

客户端负载均衡的组件 即消费者80端口

eureka client已经整合了ribbon 所以不需要单独引入jar包

在这里插入图片描述

2.getForObject和getForEntity的区别?

前者是返回json串 后者信息与前者一样、但是可以选择更详细的结果(如:筛选出状态码或者URL或者信息主体)
在这里插入图片描述

3.Ribbon替换负载均衡算法

按照官网说法、配置类不能与主启动类在同一目录下、避免被springapplication扫描到

否则该配置类会被所有的Ribbon客户端所共享,失去了特殊化的目的
在这里插入图片描述

主启动添加Ribbon注解
在这里插入图片描述

负载均衡轮询算法:

当前访问次数对总服务数取余数、根据服务名称(如:CLOUD-PAYMENT-SERVICE)来区别不同的服务

自己写一个负载均衡算法:

在8001、8002 controller中新增getPaymentLB 以便测试时能获取到当前调用的服务端口
在这里插入图片描述
在这里插入图片描述

LoadBalancer接口:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试成功:

六、OpenFeign负载均衡

1.入驻步骤

是一种restTemplate LoadBanlanced的整合
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

即多个类型的服务(按服务名称分)、则需要多个paymentFeignService接口,服务下的方法,对应接口中的抽象方法。

2.openFeign超时控制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置超时后可以正常调用timeout方法

3.OpenFeign的日志增强技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GBS20200720/article/details/121124362