源代码获取点击[这里](https://github.com/fymod/easy-spring-cloud) # 概念 通俗些说,就是各个微服务将自己的信息注册到server上,需要调用的时候从server中获取到其他微服务信息。 Spring Cloud提供了很多服务发现组件的支持,例如Eureka、Consul、Zookeeper等,本篇以Eureka为例,其他几个后续会逐个有介绍。 # Eureka Server Eureka Server是注册服务中心的服务端,启动完成是有界面的。新建项目的时候可以勾选上Cloud Discovery中的Eureka Server。当然也可以在pom.xml文件中手动添加上如下依赖。 ~~~ <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ~~~ 在启动类中添加注解@EnableEurekaServer,声明这是一个Eureka Server。 在配置文件application.yml中内容为: ~~~ server: port: 8080 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8080/eureka/ ~~~ 其中,eureka.client.register-with-eureka 表示是否将自己注册到Eureka Server,默认为true。因为当前应用就是Eureka Server,所以需要设置成false。 eureka.client.fetch-registry 表示是否从Eureka Server获取注册信息,默认为true。因为本例是一个单点的Eureka Server,不需要同步其他Eureka Server节点数据,所以设置为false。 eureka.client. service-url. defaultZone 设置的是与Eureka Server的交互地址,查询和注册服务都依赖这个地址,如果有多个可以使用英文逗号分隔。 以上步骤完成后,直接启动即可,然后浏览器地址栏输入http://localhost:8080/eureka查看界面。因为目前还没有微服务注册上,所以会显示No instances available # Eureka Client Eureka Client是注册服务中心的客户端,启动完成的时候可以在服务端界面上查看到信息。新建项目的时候可以勾选上Cloud Discovery中的Eureka Discovery,当然也可以在pom.xml文件中手动添加上依赖。需要注意的是,只添加一个client是不够的,因为启动需要tomcat的依赖,需要添加上web的引入,否则会出现以下错误 *Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaInstanceConfigBean': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)* 添加的依赖至少要有: ~~~ <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ~~~ 在启动类中添加注解@EnableDiscoveryClient,声明这是一个Eureka Client。注解也可以使用@EnableEurekaClient,不同的是@EnableDiscoveryClient同时还可以作为Zookeeper、Consul中发现注解,作用范围更广一些。 在配置文件application.yml中内容为: ~~~ server: port: 8081 spring: application: name: eureka-client-1 eureka: client: service-url: defaultZone: http://localhost:8080/eureka/ instance: prefer-ip-address: true ~~~ 其中,spring.application.name 用于指定注册服务到Eureka Server上的应用名称。 eureka.instance.prefer-ip-address 表示将自己的ip注册到Eureka Server上,如果是false的话会显示hostname而不是ip地址。 以上步骤完成后,直接启动即可,然后浏览器中查看server中是否多出来了刚刚启动的微服务。为了更便捷观察,本篇提供了两个client,仅仅是修改了启动的端口号和实例名称。 # 高可用 单节点的情况并不适用于生产环境,本节介绍如何做到集群化。如果是单台计算机,需要先修改hosts文件,比如mac电脑的hosts文件位于/etc/hosts,添加如下三行 ~~~ 127.0.0.1 peer1 127.0.0.1 peer2 127.0.0.1 peer3 ~~~ 如果是多台计算机,可以配置不同ip,而不用修改hosts。eureka.instance.prefer-ip-address=true是通过设置ip让eureka让其他服务注册它。 修改application.yml文件中的内容,配置不同profiles,作为启动时候选择参数。不同配置之间使用三个减号(---)分隔,当然也可以选择新建不同的application.yml文件,此处只写到一个文件中。 ~~~ spring: application: name: eureka-server-ha eureka: client: register-with-eureka: false --- spring: profiles: peer1 server: port: 9001 eureka: instance: hostname: peer1 client: service-url: defaultZone: http://peer2:9002/eureka/,http://peer3:9003/eureka --- spring: profiles: peer2 server: port: 9002 eureka: instance: hostname: peer2 client: service-url: defaultZone: http://peer1:9001/eureka/,http://peer3:9003/eureka --- spring: profiles: peer3 server: port: 9003 eureka: instance: hostname: peer3 client: service-url: defaultZone: http://peer2:9002/eureka/,http://peer1:9001/eureka ~~~ 在启动java类中添加注解@EnableEurekaServer。至此代码server的代码部分完成。 可以使用终端进入到项目目录,即pom.xml所在目录(或者使用Eclipse的Maven工具,效果一样),执行: ~~~ mvn clean package ~~~ 如果控制台中有了SUCCESS字样则表示成功,然后可以查看target中是否有新生成的jar文件。在三个终端中分别执行以下命令 ~~~ java -jar springcloud-2-eureka-server-ha-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 java -jar springcloud-2-eureka-server-ha-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2 java -jar springcloud-2-eureka-server-ha-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3 ~~~ 注意此处运行时会有错误提示,原因是多个server之间启动会和其他的通信,但是其他的还没启动。并不影响运行。如果要处理这个错误,可以尝试修改发送心跳的时间。 运行 http://localhost:9001 http://localhost:9002 http://localhost:9003 查看,均没有实例,但是在DS Replicas中能看到通信的其他server。 接下来实现客户端。高可用的客户端和一般的客户端是基本一致的,可以查看上面的Eureka Client,不同的地方是eureka.client.service-url.defaultZone除了可以只写任意一个server地址,也可以写多个,用逗号分隔即可。 # 用户认证和健康检查 前述demo中,Eureka Server的web控制都是无密码直接访问的,这显示存在权限控制问题,本节实现提供账号密码才能登录的方式。同时简单描述了下如何开启健康检查。 先新建一个server,和前述的server基本一致,只是增加了一个security的引入,当然也可以手动添加。 ~~~ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ~~~ 修改application.yml文件中的内容,添加上spring.security.user.name 和 spring.security.user.password。 ~~~ server: port: 9010 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:9010/eureka/ spring: security: user: name: fymod password: 123456 ~~~ 在启动java类中添加注解@EnableEurekaServer。同时,spring cloud security 默认启用了csrf,需要关闭(新建一个类实现) ~~~ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic(); super.configure(http); } } ~~~ 运行 http://localhost:9010 查看,需要输入配置的账号和密码。 接下来实现客户端。和普通的Eureka Client相比,只是eureka.client.service-url.dafaultZone中增加了用户名密码。 ~~~ server: port: 9011 spring: application: name: eureka-client-auth eureka: client: service-url: defaultZone: http://fymod:123456@localhost:9010/eureka/ instance: prefer-ip-address: true ~~~ 启动客户端后,查看server,client已经成功注册进去了。并且状态是UP,表示正常。只要保持心跳状态,就会一直显示UP,如果要更加全面的检查,可以在client的application.yml中添加eureka.client.healthcheck.enable=true。完整的为 ~~~ server: port: 9011 spring: application: name: eureka-client-auth eureka: client: healthcheck: enabled: true service-url: defaultZone: http://fymod:123456@localhost:9010/eureka/ instance: prefer-ip-address: true ~~~ 同时,在pom.xml中引入actuator。 ~~~ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ~~~ 源代码获取点击<https://github.com/fymod/easy-spring-cloud>