先简单介绍一下spring cloud简介:
spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。本系列文章的背景:本系列文章是基于本人之前的一个完整的综合站点管理系统,采用新的spring cloud系统进行微服务化的一个演变过程。原系统是一个模块化的集成系统,各个模块最终也是需要汇总到一个系统中来启动和使用,现在的目标是为了让原来的各个模块成为独立一个微服务,各个服务之间降低耦合,独立开发,独立启动,独立使用,提高系统可用性和更好的可扩展性。
在此转换过程中,是一个完整的学习到实践的过程,此过程中由于包含完整项目需求实践,因此和简单的介绍spring cloud有很多不同的地方,因为做开发都知道,一个demo很容易,但要实现在一个完整的项目中,势必会遇到很多各种奇怪的问题需要去解决和处理,而这才是我们要学习和接触一个新技术到实际投入使用之后一个很大的跨越(在我看来,在了解,接触它,到写出一个demo并不是真正的了解这门技术),照猫画虎,没有一个完整目标需求,往往不知道这个新技术是否真的能为我们解决各种不一样的问题和场景,从今天开始,我将把该项目的迁移转移过程和spring cloud的集合过程做一个完整介绍,该介绍的每一个切入点都是spring cloud的一项技术,在此过程中引入我项目的一些实际需求和解决办法,不一定是最佳解决方案,但至少是处理问题的一个方案,此博客也是我学习记录之旅,也寄希望于以后也许在我遗忘之后能有一个心路回忆,方便更快想起一个解决方案和找到更好的解决办法,这是我写该系列博客的一个重要原因。开始我们的学习之旅吧!
创建注册中心
在微服务中,一个比不可少的部分,便是一个公共的注册中心,这一点和rpc远程调用可以说是一样(关于何为rpc,后续再说吧,也可先自行搜索学习,和我们目前内容不大相干)。
使用STS(Spring Tool Suite)新建一个spring starter project

由于我已经完整建立过了,所以提示重名

由于作为注册中心,我们只选一个Eureka Server即可 然后直接点击下一步》完成,即可生成注册中心的项目,完成pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>org.rk.cloud</groupId>
<artifactId>rk-cloud-centralServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rk-cloud-centralServer</name>
<description>rk-cloud-centerServer</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.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>Dalston.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<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-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories></project>
然后在spring boot application启动类中添加注解@EnableEurekaServer,代码如下
package org.rk.cloud.centralserver;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication @EnableEurekaServer public class RkCloudCentralServerApplication {
public static void main(String[] args) {
SpringApplication.run(RkCloudCentralServerApplication.class, args);
}}
eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。eureka server的配置文件appication.properties,如下
server.port=8761 spring.application.name=centralServer spring.profiles=192.168.0.101 eureka.instance.hostname=192.168.0.101 eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ eureka.instance.ipAddress=192.168.0.101 eureka.instance.preferIpAddress=true #是否将自身注册 eureka.client.registerWithEureka=true #如果为true,启动时报警 eureka.client.fetchRegistry=false eureka.server.enableSelfPreservation=false
一般学习文件和单机使用都不需要spring.profiles,因为这是在高可用是,注册中心使用集群保障高可用需要的,多个注册中心服务组成注册中心集群,这里配合eureka.instance.ipAddress,eureka.instance.preferIpAddress两个配置来保证在启动每一个注册中心服务时将ip作为集群元素,相互监听,否则,您需要改服务器环境变量和spring.profiles一致,同时还需要将自身作为服务注册相互监听eureka.client.registerWithEureka=true
最终效果如下:

此过程问题记录:
1、由于自学,网络上提供的学习方式均为一个demo,并未提供集群部署方式,因此后来在多机器部署注册中心集群高可用时,经历需要改服务器hosts和多配置文件支持的弯路,最后才得到上面的结果,以支持集群的高可用部署
















