文章目录
- 一、Eureka
- 1、服务提供者与消费者
- 2、Eureka原理分析
- 3、搭建Eureka
- 4、服务注册
- 5、模拟多服务实例启动
- 6、服务的发现
- 二、Ribbon
- 1、负载均衡的原理
- 2、源码分析
- 3、负载均衡策略
- 三、Nacos
- 三、网关gateway
- 1、网关的作用
- 2、搭建网关服务
一、Eureka
1、服务提供者与消费者
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
很明显,这是一个相对的概念。
2、Eureka原理分析
上一篇中,远程调用时,url参数是写死在代码中的,而不同的测试、生产、开发环境IP不同,有集群时,端口也不能固定。
很明显,硬编码肯定行不通。Eureka就是来解决这个问题的。
- 每个服务启动的时候,将自己的信息注册到eureka中
- 某个服务需要调用其他服务时,向eureka拉取对应的服务信息
- 负载均衡到其中一台(如图中的localhost:8081)
- 进行远程调用
- 服务实例向eureka心跳续约,每30秒一次,eureka监控到某个服务实例不再心跳时,就从其注册信息中剔除这条信息。服务消费者拉取时当然也就拉取不到这个宕掉的服务实例
- 新启动一个服务,服务信息注册到了eureka中…以此类推
接下来开始搭建Eureka,并进行服务注册和服务发现
3、搭建Eureka
- 在父工程下新建eureka模块,选择Maven,点击Finish
- 给该模块引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--版本在父工程中统一管理,这里不用写-->
- 编写启动类,添加@EnableEurekaServer注解(自动装配的开关)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
- 添加application.yaml文件
server:
port: 10086 # 服务端口
spring:
application:
name: eurekaserver # eureka的服务名称,eureka自身也是个微服务,也要注册自己的信息到eureka注册中心
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
# eureka自身也是个微服务,也要注册自己的信息到eureka注册中心
# 王思聪住万达酒店也得身份证登记一下,虽然那就是他家的产业
- 启动eureka模块
- 注册成功
4、服务注册
接下来将user和order服务注册到eureka中:
- 在user模块的pom文件中引入eureka客户端依赖
<!--eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在application.yaml文件中增加注册中心地址的配置
server:
port: 8081
spring:
application:
name: userservice
eyreka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
- 重启user模块(order模块操作步骤相同),注册成功
5、模拟多服务实例启动
上面完成的注册都是单服务实例的,接下来在IDEA中模拟启动多个服务实例:
- 右键选择拷贝
- -Dserver.port覆盖yaml文件中的端口,从而换个新端口
- 启动这个新服务实例,注册成功
6、服务的发现
接下来实现:在order服务中完成服务信息的拉取,然后通过负载均衡挑选一个user服务,实现远程调用
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
- 修改order代码,将服务IP和端口改为服务名
String url ="http://userservice/user/" + order.getUserId();
- 在order启动类OrderApplication中的RestTemplate添加负载均衡注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
- 分别调用order接口两次,传参101和102,看它远程调用了哪个user服务实例
- 可以看到两个服务实例均有对应的日志,成功!
二、Ribbon
1、负载均衡的原理
分析:
我在浏览器中直接访问http://userservice/user/,访问失败,这是因为userservice既不是可用域名,也不是IP。那order调用到user服务的过程中经历了什么呢?
- order发起请求
- Ribbon拦截请求,拿到服务名,向eureka拉取信息
- eureka返回服务列表信息给Ribbon
- Ribbon将请求轮询到相应的服务地址上去
具体信息,在源码中打断点来调试看看。
2、源码分析
@LoadBalanced注解,就标识了调用方当前这个restTemplate这个对象发起的请求,要被Ribbon拦截
LoadBalancerInterceptor实现了ClientHttpRequestInterceptor接口:
在LoadBalancerInterceptor接口重写的intercent方法上打断点,调用order接口(中途会对user服务发起远程调用),断点进入到了这里:
继续往下,看到了Ribbon对象
继续往下:成功从eureka拿到服务列表信息
继续往下调试,看到了IRule这个接口,决定了负载均衡的策略
以上,调用接口http://localhost:8080/order/102后发生的事情如图:
- 接口中途通过restTemple远程调用http://userservice/user/1
- 被负载均衡拦截器拦截
- 获取url中的服务id,即userservice
- 动态服务列表均衡器向eureka拉取userservice的信息
- eureka返回服务列表给DynamicServiceListLoadBalancer
- 通过IRule挑选出某个服务,返回给RibbonLoadBalancerClient
- 请求被转发到了某个一具体的实例上
3、负载均衡策略
三、Nacos
认识和安装Nacos:
- 下载
- 解压
- 启动
双击startup.cmd或者执行cmd命令:
//进入bin目录,打开cmd
startup.cmd -m standalone
- 启动成功
快速入门Nacos:
- 引入依赖
- 在application.yaml写入nacos配置地址
- 启动服务,查看nacos,看到注册成功
nacos多级存储模型:
配置集群属性:
三、网关gateway
1、网关的作用
服务就像一个景点,如果人人可以访问,不管是游客还是搞破坏的人都放进来,那一定出事,由此,景区增加了入口,设保安,给游客指路,并对每日访客流量进行控制。对应网关的功能:
- 身份认证和权限校验
- 服务路由、负载均衡
- 请求限流
2、搭建网关服务
搭建:
STEP1:
创建新的模块,引入SpringCloudGateway的依赖和nacos的服务发现依赖
STEP2:
编写路由配置及nacos配置
参数含义:
具体流程: