高可用的服务注册中心-Eureka集群
Eureka集群框架图
在微服务架构这样的分布式环境中,我们要充分考虑到可能发生故障的情况,所以需要进行高可用的部署。
- 两个Eureka Server、两个服务提供者和一个服务调用者
工程结构
- 修改C:\Windows\System32\drivers\etc\HOSTS文件
因为只要一台机器,要构建集群,需要修改HOSTS文件,添加主机名映射# eureka服务器配置 127.0.0.1 eureka-server1 127.0.0.1 eureka-server2
- Eureka服务器
-
在pom.xml文件中添加依赖
<!--添加eureka服务端的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
-
在application.yml文件中进行配置
yml直接多文档块#配置服务端口 server: port: 8761 eureka: instance: hostname: eureka-server1 client: service-url: defaultZone: Http://eureka-server2:8762/eureka/ spring: profiles: eureka-server1 --- #配置服务端口 server: port: 8762 eureka: instance: hostname: eureka-server2 client: service-url: defaultZone: Http://eureka-server1:8761/eureka/ spring: profiles: eureka-server2
-
启动类配置@EnableEurekaService
@SpringBootApplication // @EnableEurekaService:EurekaServer服务器端启动类,接受其它微服务注册进来 @EnableEurekaServer public class WzxSpringCloudEurekaApplication { public static void main(String[] args) { SpringApplication.run(WzxSpringCloudEurekaApplication.class, args); } }
-
使用Maven 将项目打成jar包
-
- 在命令行通过spring.profiles.active属性分别启动eureka-server1和eureka-server2
java -jar wzx-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka-server1 java -jar wzx-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka-server2
- 访问http://eureka-server1:8761/和http://eureka-server2:8762/
可以看到两个Eureka Server已经相互注册
- 服务提供者
-
在pom.xml文件中引入依赖
<!--添加eureka,将服务提供者注册到eureka中--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
-
在application.propreties文件中进行配置
将服务提供者注册到两个Eureka Server中去server.port=9000 eureka.instance.hostname=localhost eureka.client.service-url.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server1:8762/eureka/ spring.application.name=wzx-spring-cloud-provider
-
编写启动类,添加@EnableEurekaClient注解声明该应用是一个Eureka客户端
@SpringBootApplication // 扫描Mapper接口 @MapperScan("com.wzx.dao") // @EnableEurekaClient:声明该应用是一个Eureka客户端 @EnableEurekaClient public class WzxSpringCloudProviderApplication { public static void main(String[] args) { SpringApplication.run(WzxSpringCloudProviderApplication.class, args); } }
-
编写Controller,提供简单的REST服务
@RestController @RequestMapping("/dept") public class DeptControllerProvider { @GetMapping("/findDept") public Dept findDept(HttpServletRequest request) { Dept dept = new Dept(); dept.setDeptno(1L); dept.setDname("开发部"); // 将请求地址封装进参数中来测试负载均衡 dept.setDb_source(request.getRequestURL().toString()); return dept; } }
-
通过java jar命令行的方式启动两个不同端口的服务提供者
java -jar wzx-spring-cloud-provider-0.0.1-SNAPSHOT.jar --server.port=9000 java -jar wzx-spring-cloud-provider-0.0.1-SNAPSHOT.jar --server.port=9001
-
- 服务消费者
-
在pom.xml文件中添加依赖
服务消费者端多引入一个ribbon依赖进行负载均衡<!--添加eureka,将服务消费者注册到eureka中--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--客户端的负载均衡,轮询--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
-
在application.xml文件进行配置
#消费者端口 server.port=80 spring.application.name=wzx-spring-cloud-consumer eureka.instance.hostname=localhost eureka.client.service-url.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/
-
配置RestTemplate
RestTemplate是Spring提供的一种简单便捷访问Restful服务模板类,提供用于访问Rest服务的客户端模板类@Configuration public class RestTemplateConfig { /** * RestTemplate:提供了多种便捷访问远程Http服务的方法 * 是一种简单便捷访问Restful服务模板类,提供用于访问Rest服务的客户端模板类 */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
编写Controller,通过服务提供者名来调用服务
/** * @author WangZX * @create 2018-09-27 14:54 */ @RestController @RequestMapping("/consumer/dept") public class DeptController { @Autowired private RestTemplate restTemplate; @GetMapping("findDept") public Dept findDept() { //通过服务提供者名称调用 Dept dept = restTemplate.getForObject("http://wzx-spring-cloud-provider/dept/findDept", Dept.class); return dept; } }
-
- 使用HttpClient进行测试
HttpClient是Apache提供的一个Http工具包-
在pom.xml引入HttpClient依赖
<!--引入Apache HttpClient--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency>
-
编写测试程序TestHttpClient
/** * @author WangZX * @create 2018-09-28 19:18 */ public class TestHttpClient { public static void main(String[] args) throws IOException { // 创建客户端 CloseableHttpClient client = HttpClients.createDefault(); // 创建HttpGet对象 HttpGet httpGet = new HttpGet("Http://localhost/consumer/dept/findDept"); // 多次请求,测试负载均衡 for (int i = 0;i < 6;i++){ // 执行Get请求 HttpResponse response = client.execute(httpGet); // 解析响应 System.out.println(EntityUtils.toString(response.getEntity())); } } }
-
通过java jar启动两个Eureka 服务器
-
通过java jar启动两个端口不同的服务提供者
-
启动消费者
-
- 测试结果展示
可以看到9000和9001端口的服务提供者被轮询调用!