
SpringCloud Eureka-服务注册与发现02
3.搭建EurekaServer集群-实现负载均衡&故障容错
3.1为什么需要集群EurekaServer?
- 微服务RPC远程服务调用最核心的是高可用
- 如果注册中心只有1个,如果出现故障,会导致整个服务环境不可用
- 解决办法就是搭建Eureka注册中心集群,实现负载均衡和故障容错(构成集群的几个主机之间的提供的服务是相同的)
3.2搭建EurekaServer集群
3.2.1搭建第二个注册中心
搭建的具体步骤和 e-commerce-eureka-server-9001 一样,见上篇2.2
(2)创建配置文件application.yml
server:
port: 9002
#配置Eureka-server
eureka:
instance:
hostname: eureka9002.com #服务实例名
client: #如果Eureka是一个集群,那么相互两个EurekaServer之间也可以当做对方为客户端
#配置是否向注册中心注册自己
register-with-eureka: false
#表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
fetch-registry: false
service-url:
#当前的注册中心 需要注册到 Eureka9001 注册中心
defaultZone: http://eureka9001.com:9001/eureka/
(3)创建主启动类
package com.li.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author 李
* @version 1.0
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication9002 {
public static void main(String[] args {
SpringApplication.run(EurekaApplication9002.class,args;
}
}
3.2.2修改第一个注册中心
(1)修改 e-commerce-eureka-server-9001 的 application.yml 文件
server:
port: 9001
#配置Eureka-server
eureka:
instance:
hostname: eureka9001.com #服务实例名
client: #如果Eureka是一个集群,那么相互两个EurekaServer之间也可以当做对方为客户端
#配置是否向注册中心注册自己
register-with-eureka: false
#表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
fetch-registry: false
service-url: #设置于 Eureka server 的交互模块,查询服务和注册服务都需要依赖这个地址
#EurekaServer之间相互注册
defaultZone: http://eureka9002.com:9002/eureka/
(2)将e-commerce-eureka-server-9001的主启动类的名称修改为 EurekaApplication9001
3.2.3修改host文件
eureka9002.com:9002/eureka/的地址,可以直接访问到,这里修改host文件,对上述指定域名进行本机的ip映射。
C:\Windows\System32\drivers\etc\hosts
3.2.4完成测试
3.3.5将其他微服务注册到EurekaServer集群
(1)将member-service-provider-10000注册到 EurekaServer 集群
eureka:
service-url:
#将本微服务注册到多个EurekaServer,使用逗号间隔
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
(2)将member-service-consumer-80注册到 EurekaServer 集群:同上,修改位置相同(略)。
3.3搭建会员中心服务提供方集群
同样的,为了高可用性,我们不仅在EurekaServer中要使用集群,在服务提供方也要使用集群(构成集群的几个主机之间的提供的服务是相同的)。
3.3.1搭建第二个服务提供方
(1)创建Module-member-service-provider-10002
(3)然后在10002的pom.xml中导入和10000的pom.xml相同的依赖
(5)测试
3.3.2注意事项和细节
spring:
application:
name: member-service-provider #同一将服务提供方的应用名设置为member-service-provider
设置后,重新启动服务启动方,在EurekaServer中可以看到注册列表中只有一个服务提供名,但是它包含了两个远程调用的接口:
3.4配置服务消费端使用会员中心服务集群
(1)修改MemberConsumerController.java
package com.li.springcloud.controller;
import ...
/**
* @author 李
* @version 1.0
*/
@RestController
@Slf4j
public class MemberConsumerController {
@Resource
private RestTemplate restTemplate;
/**
* 1.MEMBER-SERVICE-PROVIDER 是服务提供方[集群]注册到EurekaServer的别名
* 2.也是服务提供方[集群]对方暴露的名称
* 3.这里MEMBER-SERVICE-PROVIDER 目前有两个可以获取的区域:
* member-service-provider-10000、member-service-provider-10002
*/
public static final String MEMBER_SERVICE_PROVIDER_URL =
"http://MEMBER-SERVICE-PROVIDER";//改为提供服务模块的别名
//添加对象到数据库表中
@PostMapping("/member/consumer/save"
public Result<Member> save(Member member {
return restTemplate.postForObject
(MEMBER_SERVICE_PROVIDER_URL + "/member/save",
member,
Result.class;
}
//根据id调用服务接口,返回member对象信息
@GetMapping("/member/consumer/get/{id}"
public Result<Member> getMemberById(@PathVariable("id" Integer id {
return restTemplate.getForObject
(MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id,
Result.class;
}
}
(2)修改 CustomInitBean.java
package com.li.springcloud.config;
import ...
/**
* @author 李
* @version 1.0
* 注入RestTemplate Bean
*/
@Configuration
public class CustomInitBean {
@Bean
@LoadBalanced //赋予RestTemplate负载均衡的能力,默认是使用轮询算法来访问远程调用接口
public RestTemplate getRestTemplate( {
return new RestTemplate(;
}
}
(3)依次启动EurekaServer集群、服务提供方集群、服务消费方
先用浏览器直接访问服务提供方集群的接口,目的是测试服务提供方是否正常工作:
服务消费方的接口,测试服务消费方是否正常工作:
同一个地址(即只有一个服务消费方模块),但是底层调用的服务提供方是不一样的(轮询访问)
第二次访问:
交替访问member服务说明:
- 注解 @LoadBalanced底层是Ribbon支持算法
- Ribbon和Eureka整合后,服务消费方可以直接调用服务,而不用再关心服务提供方的地址和端口号
- 该服务还有负载功能
3.5通过DiscoveryClient获取EurekaServer服务注册信息
这里以服务消费方为例,获取EurekaServer的服务注册信息:
package com.li.springcloud.controller;
import ...
/**
* @author 李
* @version 1.0
*/
@RestController
@Slf4j
public class MemberConsumerController {
@Resource
private RestTemplate restTemplate;
//装配一个DiscoveryClient,
//注意用的包是 import org.springframework.cloud.client.discovery.DiscoveryClient;
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/member/consumer/discovery"
public Object discovery( {
List<String> services = discoveryClient.getServices(;
for (String service : services {
log.info("服务名={}", service;
//通过服务名来获取服务名对应的实例
List<ServiceInstance> instances = discoveryClient.getInstances(service;
for (ServiceInstance instance : instances {
log.info("id={},host={},port={},uri={}",
instance.getServiceId(, instance.getHost(,
instance.getPort(, instance.getUri(;
}
}
return discoveryClient;
}
//其他方法略..
}
(2)修改启动类,添加注解启用服务发现
http://localhost/member/consumer/discovery,后台输出如下: