背景
微服是现在的主流技术,我觉得大家有必要对其进行学习,毕竟搞技术的要跟上时代的步伐!好了,也不兜兜转转了,直接进入本次的主题。
什么是微服务架构
微服务架构是将原来庞大的单体项目进行拆分,拆分后的每一个模块独立形成一个新的项目,服务之间可按照一定方式进行通信的架构
常见微服架构
- Dubbo/Dubbox(本次不讲)
Dubbo是阿里巴巴公司开源的一个高性能服务框架,通过RPC调用,RPC即 Remote Procedure Call(远程过程调用),Dubbox是当当网对Dubbox进行升级改 良。 - Spring Cloud
Spring Cloud 是基于Spring Boot 的一整套实现微服务的框架,它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。调用方式为RESTful,可以理解为在Wed请求中,将参数封装于URL内部(如使用URL:www.baidu.com/getUserInfo/12,获取用户ID为12的详细用户信息)
Spring Cloud 体系
- Eureka:Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移
- Feign:Feign是一种声明式、模板化得HTTP客户端,能够简化服务之间的接口请求
- Hystrix:Hystrix是一种容错管理工具,能够通过熔断机制控制服务节点,从而对延迟和故障提供更强大的容错能力。
- Ribbon:Ribbon提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
- Zuul:Zuul是可以提供动态路由。监控、弹性、安全等边缘服务的框架,相当于是设备和Netflix流应用的所有Web网站后端请求的第一站。
- Config:Config是配置管理工具包,可以把配置放到远程服务器上,集中化管理集群配置,目前支持本地存储、Git以及Subversion。
- Sleuth:Sleuth能够跟踪一个请求在微服务间的传播过程,详细记录服务的调用链路,并能统计调用的耗时等数据,帮助分析和优化系统性能。
使用Eureka实现注册中心及注册服务
1.Eureka简介
Eureka 包含服务端Eureka Server和客户端Eureka Client两部分。服务端也被称为服务注册中心,用于提供服务和发现。客户端服务启动后会将自身注册至服务器端,客户端会周期性地向注册中心发送心跳包来保持服务连接。
2.编写Eureka Server
(1)新建一个Spring Boot 项目(不会的伙伴可以百度)
(2)在刚刚建的项目的pom.xml文件中添加对SpringCloud的相关依赖
关键代码:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--这个是为了实现不能随意访问服务导的包(安全机制) alt+insert选择manager...可以快速选择mavenjar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</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>
(3)添加启动注解:在启动类上添加注解@EnableEurekaServer,声明这是一个Eureka Server
(4)添加配置信息:修改默认的配置文件application.properties为application.yml(这个改不改都可以,建议统一,要注意缩进)
server:
port: 7776
eureka:
client:
service-url:
defalutZone: http://localhost:7776/eureka/ #给那些想找它的人提供地址
#defalutZone: http://localhost:7777/eureka/,http://localhost:7778/eureka/ 配置多个注册中心,通过“,”隔开,也就是7776,7777,7778三个,给那些想找它的人提供地址
fetch-registry: false #默认是true,服务之间互相抓取(有多个服务的情况下),false为关闭
register-with-eureka: false #默认是true,是否把当前这个项目添加到注册中心里(这个项目本身就是做服务的没有比较再交给自己管理,如果是业务的项目就是设置为true)
security:
basic:
enabled: true #在这个项目里启用安全机制(为了不给谁都可以访问)
user:
name: root #用户名
password: 123456 #密码
(5)启动运行验证:http://localhost:7776如果成功访问到Eureka Server主页即代表成功(这里有一个坑,这个访问路径只需要到端口就行,上面配的那个http://localhost:7776/eureka/中的Eureka不用)
3.注册微服务到Eureka Server(也就是客户端,即实现业务功能的子项目)
(1)新建一个Spring Boot 项目(不会的伙伴可以百度)
(2)在刚刚建的项目的pom.xml文件中添加对SpringCloud的相关依赖
关键代码:
<dependencies>
<!--这个feign是去找别人,其他的客户端是等着别人来找就可以了-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--这两个可以实现基本启动和注册了-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--这两个可以实现基本启动和注册了-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!--实体模块-->
<dependency>
<groupId>com.example</groupId>
<artifactId>dm-common-model</artifactId>
<version>1.0-SNAPSHOT</version>
</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>
(3)添加启动注解:在启动类上添加注解@EnableDiscoveryClient,声明这是一个Eureka Client
(4)添加配置信息:修改默认的配置文件application.properties为application.yml(这个改不改都可以,建议统一,要注意缩进)
server:
port: 8081
spring:
application:
name: dm-user-consumer #起个名字,给别人找(注册到Eureka Server中的名称)
eureka:
client:
service-url:
#defaultZone: http://localhost:7776/eureka/ #客户端注册到哪里去(指定Eureka Server的地址)
defaultZone: http://root:123456@localhost:7776/eureka/ #服务中心加了安全机制后,客户端如果要访问那就必须带上root:用户名,123456密码加上“@”,否则启动报错
feign:
hystrix:
enabled: true #开启异常管理(hystrix容错)
(5)运行验证注册:依次启动服务端,客户端,访问http://localhost:7776如果成功访问到Eureka Server主页,可以看到Application下已经出现客户端微服务,在Status中显示UP表示该服务正常运行,如果服务出现异常,会显示为DOWN.
4.为Eureka Server添加用户认证(前面Eureka Server是允许匿名用户直接访问的,这样不安全,为其设置登录认证)
(1)添加依赖:在Eureka Server项目的pom.xml添加依赖
<!--这个是为了实现不能随意访问服务导的包(安全机制) alt+insert选择manager...可以快速选择mavenjar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
(2)添加配置(在Eureka Server项目中application。yml中添加)
security:
basic:
enabled: true #在这个项目里启用安全机制(为了不给谁都可以访问)
user:
name: root #用户名
password: 123456 #密码
(3)运行验证,访问Eureka Server,这时就会弹出输入账号密码进行验证,那么微服务(客户端)要注册到Eureka Server上必须指定用户名和密码,否则启动会报异常,无法正常注册
在微服务项目上的application.yml文件在注册中心地址前添加“用户名:密码@”
defaultZone: http://root:123456@localhost:7776/eureka/ #服务中心加了安全机制后,客户端如果要访问那就必须带上root:用户名,123456密码加上“@”,否则启动报错