0.0 刚开始学习springcloud,做个笔记
1.springcloud的技术基础
- springMVC
- springBoot
- MyBatis
- Maven
- Git
2.学习技术(低版本,2019年之前使用,重在学习技术理念):cloud的五大神兽
Rest: 微服务构建
Eureka: 服务注册和发现
Ribbon: 负载均衡
Feign: 服务器调用
Hystrix: 服务熔断,降级
Zuul: 网管
Config: 配置中心
3.技术形式
1,约定 > 配置 > 编码
2,编码风格
建module
改pom
写yml
主启动
业务类
3,抽取底层(依赖层)项目注意事项
先抽取
后clean
再install
加引用
4.编码
4.1父项目:管理项目,无具体实现,且不添加依赖,只约定不实现
4.1.1建module
新建maven项目
4.1.2改pom
<packaging>pom</packaging>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</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>
<!-- alibaba cloud -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- alibaba druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mybatis springboot starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.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>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</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>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
5 Eureka注册中心
5.0 Eureka基础知识
5.0.1 Eureka 基本概念介绍
什么是服务治理
spring cloud 封装了NetFlix公司开发的Eureka模块来实现“服务治理”
在传统的RPC远程调用框架中,管理每个服务于服务之间依赖关系比较复杂,
所以需要“服务治理”,管理服务与服务之间依赖关系,可以实现服务调用,负载均衡,容错等,实现服务发现与注册
什么是服务注册
Eureka采用cs的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。
系统中其他微服务,使用Eureka的客户端链接到Eureka Server并维持心跳链接
这样系统的维护人员就可以通过Eureka server来监控系统中各个微服务是否正常运行
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息,比如服务地址,通讯地址等以别名的方式注册到注册中心上。
消费者|服务提供者以该别名的方式从注册中心上火渠道实际的服务通讯地址,然后在实现本地RPC调用
RPC远程调用核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。
在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka的两个组件
Eureka Server:提供服务注册
各个微服务借点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有服务节点的信息,且可以在界面中直观看到
Eureka Client:通过注册中心进行访问
十一个Java客户端,用于简化EurekaServer的交互。
客户端同时具备一个内置的,使用轮询(round-robin)负载均衡算法的负载均衡器
在应用启动后,将会向EurekaServer发送心跳(默认周期30s)
如果EurekaServer在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务中册表中把这个服务节点移除(默认90s)
5.0.2 Eureka中使用的注解
主启动类注解
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
controller注解
@RestController
@Slf4j
URL参数方法
@GetMapping(value = "/member/get/{id}")
getMember(@PathVariable("id") String id)
如果有参数是封装类型 要加RequestBody注解,
serviceImpl注解
@Service
dao注解
@Mapper
配置类注解:ApplicationcontextConfig
@configuration
RestTemplate注入和LoadBalanced注解
@Bean
@LoadBalanced // 使用loadBalanced注解,赋予RestTemplate负载均衡的能力
5.1 注册中心项目:新建module->maven项目
5.1.1 pom依赖
<parent>
<artifactId>cloud01</artifactId>
<groupId>com.jyxabc.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-eureka-server8031</artifactId>
<dependencies>
<!-- Eureka 1.X 旧版本 -->
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-starter-eureka</artifactId>-->
<!--</dependency>-->
<!-- Eureka 2.X 新版本 -->
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.jyxabc.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
5.1.2 yml配置文件
server:
port: 8031
#spring:
# application:
# name:
eureka:
instance:
hostname: eureka8031.com
# hostname: localhost #eureka服务端实例名称 #单机可以使用localhost,集群需要使用实例名称
client:
# 是否要把自己注册到中心注册
register-with-eureka: false
# 是否需要检索服务
fetch-registry: false
service-url:
# 设置Eureka Server 交互的地址,查询服务和注册服务需要依赖这个地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机注册地址是自己
defaultZone: http://eureka8032.com:8032/eureka/
5.1.3 主启动类
@SpringBootApplication // springboot 主启动服务注解
@EnableEurekaServer // Eureka注册中心服务注解
public class EurekaMain8031 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain8031.class);
}
}
5.1.4 注册中心集群配置说明
Eureka 集群原理说明
服务注册
将服务信息注册金服务注册中心
服务发现
从注册中心上获取服务信息
实质
存key服务名,取value调用地址
客户端工作原理
启动Eureka注册中心(EurekaServer:eurekaServer)
启动服务提供者(EurekaClient:memberServer ...)
服务提供者启动后会把自身信息(服务地址)以别名的方式注册进Eureka
消费者(customer,也可以是服务提供者,身份相对而言)在需要调用服务的时候,使用服务别名去注册中心获取实际的RPC远程调用地址
消费者获得调用地址后,底层实际上是李咏httpClient技术实现远程调用
消费者获得服务地址后会换存在本地jvm中,默认每间隔30s更新一次服务调用地址
微服务注册中心集群原理?
相互注册,相互守望
微服务注册中心集群的作用是什么?(RPC远程调用最核心)
高可用,如果只有一个注册中心,一旦注册中心当即,既整个系统不可用
实现高可用,负载均衡和故障容差
Eureka自我保护(CAP)
某个时刻微服务不可用(网络原因...),但是注册中心仍然保持对该服务的信息持有,并不是立即删除