【Spring Cloud】分布式必学springcloud(二)——注册中心Eureka
一、前言
在上一篇博客中,小编简单的向大家介绍了springcloud的一些概念,大家可能对那些还是不太的了解,不过没有问题,盲人摸象嘛,慢慢的摸,你会了解的越来越多的。所以不用担心。在下面的博客,小编依次介绍,依次实现。
在这篇博客中,小编介绍一下注册中心——Eureka。
二、注册中心Eureka
想必做过Dubbo的老铁们一定使用过Zookeeper吧。这里的zookeeper就起到了一个注册中心的作用。Dubbo架构中分成了提供者和消费者,提供者需要把自己的服务注册到注册中心,消费者订阅注册中心,注册中心有提供者后,会通知消费者。ZK起到了一个服务协调的作用。
在springcloud中,自己提供了一个注册中心——Eureka。
Eureka是一个基于REST(Representational State Transfer)的服务,主要用于AWS cloud, 提供服务定位(locating services)、负载均衡(load balancing)、故障转移(failover of middle-tier servers)。我们把它叫做Eureka Server. Eureka也提供了基于Java的客户端组件,Eureka Client,内置的负载均衡器可以实现基本的round-robin负载均衡能力。在Netflix,一个基于Eureka的更复杂的负载均衡器针对多种因素(如流量、资源利用率、错误状态等)提供加权负载均衡,以实现高可用(superior resiliency).
三、服务注册中心
3.1 建立Maven项目
小编使用springboot的快速生产项目的网站 [http://start.spring.io/][http_start.spring.io],来生产项目:
导入idea:
3.2 导入Eureka依赖和springcloud依赖
在maven的pom文件中,添加Eureka依赖:`spring-cloud-starter-eureka-server`
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.forezp</groupId>
<artifactId>eurekaserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR2</spring-cloud.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring boot test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
添加完成的时候,如果要建立父子pom,需要把`${spring-cloud.version}`提取出来。这样子pom中跟springcloud相关的就不用设置版本号了。
3.3 代码编写
springboot有一个application的启动类,我们这里就修改这个启动类:添加`@EnableEurekaServer`。通过这个注解,启动一个服务注册中心提供给其他应用进行对话。
package com.wl.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, args);
}
}
3.4 修改配置文件
在默认情况下,注册中心会将自己作为客户端来尝试注册自己,所以我们需要禁用它的客户端注册行为。需要在application.properties文件或application.yml中添加配置。
注意:生成的maven项目默认是application.properties,没有application.yml,对比一下,官方很多的demo中使用的是application.yml,另外application.yml天然的形成了树结构。代码写的也少。
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
代码说明:
- eureka.client.registerWithEureka:false ,由于应用为注册中心, 来表明自己是一个eureka server. 不会把自己注册到自己上。
- eureka.client.fetchRegistry:由于注册中心的职责是维护服务实例,不需要去检索服务,所以也设置为false
3.5 运行
运行后,输入`http://localhost:8761/`,打开注册中心监控页面:
3.6 Eureka配置用户名密码登录
pom文件中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
修改配置文件:
server:
port: 8761
security:
basic:
enabled: true
user:
name: admin
password: admin
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/
再次登录的时候,会出现输入账户和密码的弹窗:
四、服务提供者
建立如下的结构:
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
创建过程同server类似,创建完pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wl</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.wl</groupId>
<artifactId>scf</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
</project>
创建controller:
package com.wl.client.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/** * Created by Ares on 2018/4/11. */
@RestController
public class User {
@GetMapping("/user/findById")
public String findById(@RequestParam("id")String id){
return "这个是springcloud的客户端"+id;
}
}
配置启动类:
package com.wl.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
类中@EnableEurekaClient或@EnableDiscoveryClient注解,激活EurekaDiscoveryClient实现,自动化配置,创建DiscoveryClient接口针对Eureka客户端的EnableDiscoveryClient实例。
修改配置文件:
server:
port: 9001
eureka:
client:
serviceUrl:
defaultZone: http://${security.user.name}:${security.user.password}@localhost:8761/eureka/
spring:
application:
name: client1
security:
basic:
enabled: true
user:
name: admin
password: admin
在配置文件中,使用spring.application.name配置服务名,如命名为client1;通过eureka.serviceUrl.defaultZone指定服务注册中心的地址,这里小编指定的是之前建立的注册中心地址。
依次启动注册中心`http://localhost:8761/`和提供者
我们可以通过访问 `http://localhost:9001//user/findById?id=1`来访问提供者:
五、小结
Eureka服务注册发现,容错管理、失效剔除、自我保护、安全验证。功能真是很强大,使用也非常好用,多多用吧。
还没有评论,来说两句吧...