文章目录
大家好,接着上一篇讲,假如我们的服务提供者user-service部署了多个实例,如图:
大家思考几个问题:
- order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
- 有多个user-service实例地址,order-service调用时该如何选择?
- order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?
这些都需要注册中心来解决,像远程调用我们也需要解决掉这种硬编码的形式,因为同一个微服务可能会有多个实例,端口又都不一样
1.搭建Eureka注册中心
首先我们应该知道,注册中心它本身是完成服务注册的功能的,保证微服务来它这里拿其他微服务来使用,所以它本身也是一个独立的微服务,在启动时也会将自己注册进自己的注册中心
所以我们先来创建一下这个微服务
1.创建eureka-service服务
2.引入eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.编写启动类
这里选择Server这个不要选错了,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class);
}
}
4.编写配置文件
application.yml
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
5.启动服务
访问http://localhost:10086
我们看到eureka把自己注册进去了
2.服务注册
我们的eureka注册中心已经搭建好了,这个时候我们尝试把更多的服务注册进去让其管理
在注册进eureka之前我们先要引入依赖让用户服务变为客户端注册进eureka
1.引eureka-client依赖
将依赖引入user-service的pom文件中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
复制user-service,再启动一个用户服务实例
修改端口,临时属性会覆盖掉配置属性
2.配置user-service的配置文件
修改application.yml文件,添加服务名称和eureka地址
server:
port: 8081
spring:
application:
name: userservice # 服务名称
datasource:
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
username: root
password: Mysql.123
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
# 添加eureka地址,这个地址我们在创建注册中心时配置有,可以直接复制过来,防止出错
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
3.启动实例
访问http://localhost:10086/
没有order-service是因为我们没有对其因依赖并配置,找不到注册中心,所以它没办法注册进eureka。
3.实现远程调用与负载均衡
我们在上步没有将order-service注册进eureka,所以我们也调用不了注册中心的微服务,如果想调用需要将order-service也注册进去
步骤和上面的一样
1.引依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.配置文件
server:
port: 8080
spring:
application:
name: orderservice
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
username: root
password: Mysql.123
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
重启order-service服务
3.服务拉取与负载均衡
我们的任务还是希望order-service调用user-service服务,这个时候user-service实例有两个,以后在开发过程中可能会有更多,我们就需要考虑实现负载均衡了,以此来减小服务器的压力并且使用户获得更好的体验
但是这些都不需要我们做,只需要几个注解就可以实现
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:
这个时候我们就可以让order-service去调用user-service并且实现了负载均衡,但是我们这个时候还存在一个问题,就是order-service调用user-service是硬编码url不能实现从注册中心来拿服务的目的,所以需要解决硬编码问题
怎么解决?很简单,这个时候就需要用我们刚才写的服务名称配置了,服务名称是唯一的,这就可以作为我们取注册中心拿服务的唯一依据,修改后如下↓↓↓↓↓↓
spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。
重启服务启动,进行访问调用
成功的调用,user键值对也有数据
接下来我们来验证下@loadbanlance这个注解是否帮我们实现了负载均衡,怎么验证?
很简单,我们将访问的地址刷新个十次或者五六七八次都可以,看看我们调用user-service服务是否两个实例都有被调用,如果都被调用说明实现了负载均衡,如果只调用了一个实例说明没有实现
我这里刷新了六次
然后两个实例的情况如下,分别为三次,实现了负载均衡
4.负载均衡的配置
我们上面不仅实现了注册也实现了调用,目的已经达到,但是我们在最后实现负载均衡时,大家也可以尝试下,就是你刷新六次两个实例分别访问了三次,刷新十次两个分别访问五次,这其实就是负载均衡策略中的轮询方案,默认是轮询的
负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:
不同规则的含义如下:
我们自己也可以对负载均衡的策略进行配置有两种方式
1.代码方式
在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule(); //随机访问策略
}
2.配置文件方式
在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注意,一般用默认的负载均衡规则,不做修改。
5.饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
该配置写在消费者配置中即order-service配置中
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: userservice #饥饿加载的微服务
在未开启饥饿加载时我们调用user-service耗时
第一次访问耗时最长
再刷新一次耗时明显变短
开启饥饿加载重启服务
第一次访问
第二次访问
我们很容易发现第一次访问时快了不少,这就是饥饿加载的好处,但是默认是进行懒加载的,我们需要自己开启
好了,各位大哥,这就是eureka的简单使用了包括注册中心搭建、服务注册、服务调用、负载均衡…
感谢观看,点个赞小弟很感谢φ(>ω<*) 小弟会持续输出~