生命不息、学习不止
入行java后,各种框架什么的,都需要掌握啊,题主也还是在不断学习中。
现在所有的互联网公司,都是在用微服务,除去一些老的传统行业,可能还是在使用Struts或者Spring等。微服务的相关概念,仍然是主流。一起学习吧!
目录
五、eureka访问服务是怎么选择提供者访问的呢?(负载均衡)
一、注册中心
凡是都是要先提问题的,什么是注册中心呢?
大家肯定在编写业务代码的时候,肯定会获取数据,当获取数据的URL是可变的,是不是经常会需要更改配置或者代码,还得重启服务。相信大家肯定都有遇到,所以在微服务中,服务与服务之间都是低耦合的。注册中心也就是集中管理服务的一个组件,也是微服务中最基本的一个组件。
二、常见的服务注册中心
下图是常见的注册中心及各自的特性
CAP特性:Consistency、Availability、Partition tolerance
C:在分布式系统中的所有数据备份,在同一时刻是否是同样的值。(一致性)
A:保证每个请求不论成功或者失败都有回应。(可用性)
P:系统中任意信息的丢失或失败不会影响系统的继续运作。(分区容错性)
三、EureKa项目搭建与实例获取
1、新建项目--maven的多module项目--项目构建不会的自行先学习学习哈
2、新建EureKa的module(springboot)--导入依赖--cloud依赖--eureka依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</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、配置单机或集群
单机:一个服务
集群:多个服务
3.1 项目搭建好后,先增加注解:项目启动类加上@EnableEurekaServer
3.2 修改hosts配置 自定义域名对应本机IP即可
如:127.0.0.1 eureka-01 #多个就写多行
3.3 修改项目配置
spring.application.name=eureka-server
eureka.instance.hostname=eureka-01
# ip + port显示
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
以上配置必须有
单机:
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
集群:
eureka.client.service-url.defaultZone=http://test:666666@eureka-02:8762/eureka,http://test:111111@eureka-03:8763/eureka
单机或集群根据你的项目选择,集群需要注意,上面的test:666666为账号与密码,如果你的项目没有配置springSecurity则不需要,eureka-02是其他的eureka客户端
启动对应的服务后可访问你的eureka客户端查看集群是否搭建完成
成功访问上图就成功啦
4.新增消费者和提供者module (springboot工程)
导入依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
4.1 项目搭建好后,先增加注解:项目启动类加上@EnableEurekaClient
4.2 增加配置
eureka.client.service-url.defaultZone=http://test:888888@eureka-01:8761/eureka,http://test:666666@eureka-02:8762/eureka,http://test:111111@eureka-03:8763/eureka
# 表示是否将自己注册到注册中心,默认为true
eureka.client.register-with-eureka=false
4.3 启动项目,查看是否注册到eureka (一般先启动提供者、后启动消费者)
四、验证是否可以访问
1、消费者中注入Bean
//获取实例
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
public String sayHello(){
//指出服务地址 http://{服务提供者应用名名称}/{具体的controller}
String url = "http://provider-user/user/sayHello";
//返回值类型和我们的业务返回值一致 参数:地址、返回参数类型
return restTemplate.getForObject(url,String.class);
}
提供者写对应的业务代码
@RequestMapping("/user/sayHello")
public String sayHello(){
return "I'm provider-1 ,hello consumer!";
}
若指定方法是Get,那就用Get,如果是POST则使用postForObject,RestTemplate支持Http的相关方法
上图就是访问成功啦!
五、eureka访问服务是怎么选择提供者访问的呢?(负载均衡)
负载均衡机制:
1、轮询--RoundRobinRule
2、随机--RandomRule
3、响应权重--ResponseTimeWeightedRule
4、最小并发--BestAvailableRule
源码:
定义规则:可自由配置
1、全局配置访问规则 注入Bean
@Bean
public IRule rule(){
return new RandomRule();
}
2、局部配置
配置文件中加入:服务实例名+....
provider-user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
六、其他配置 下线
1、注册服务保留失效服务的时间 eureka.server.eviction-interval-timer-in-ms 设置较小值,单位毫秒
eureka.server.enable-self-preservation
2、业务服务 设置失效剔除 eureka.instance.lease-expiration-duration-in-seconds
指EureKa服务端在收到最后一次心跳之后等待的时间,单位为秒,超过则剔除,默认90秒