通过前文的讲解, 大家对springboot 的简单应用有了一些了解,但是在实际工作中, 各个事业部,产品线都在维护着各自的项目, 又依赖着其他产品线的项目, 那么,各个项目的相互依赖以及调用该如何高效简洁的维护呢,是时候该让服务注册与发现这一理念上场了:服务发现机制 是指 服务消费者通过该机制获取的服务提供者的信息,即使服务提供者的配置或者信息发生变化,对于消费者是无感知的,或者说是低侵入式的。
先简单说一下服务提供者, 服务消费者 以及注册中心(就是服务发现组件)这三者之间的关系
- 各个服务在启动的时候都会讲自身的配置信息等都注册到注册中心,注册中心就会保存这些信息,以便其他服务调用,这里所说的各个服务包括服务提供者, 服务消费者,以及注册中心自己(这个在后文中会有讲解)
- 服务消费者并不知道服务提供者网络信息, 而是先通过注册中心获取提供者的网络地址,然后再去调用服务
- 各个服务与注册中心通过一定的机制(比如心跳检查)来通信,表示自身服务健在,如果某个服务长时间无法与注册中心通信, 注册中心就会注销该实例
- 服务地址发生变化后,会重新向注册中心注册。消费者无需人工修改提供者的网络地址等信息
eureka 就是springcloud 家族中的注册中心组件,本身就是一个rest服务, 包含server 和client 端
下面我们编写一个简单的Eureka Server
buildscript {
repositories {
mavenLocal()
maven {
url "http://maven.aliyun.com/nexus/content/groups/public/"
}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.9.RELEASE")
}
}
apply plugin: 'application'
apply plugin: 'org.springframework.boot'
def env = System.getProperty("env") ?: "dev"
sourceSets {
main {
resources {
srcDirs = ["src/main/resources", "src/main/profile/$env"]
}
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Edgware.SR1"
}
}
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
}
配置文件 application-peer1.yml
server:
port: 6201
eureka:
instance:
prefer-ip-address: true
hostname: 127.0.0.1
client:
serviceUrl:
defaultZone: http://127.0.0.1:6202/eureka
register-with-eureka: true
fetch-registry: true
spring:
application:
name: miracle-eureka-server
logging:
config: classpath:log4j2.xml
启动类
package com.miralcle.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by naonao on 18/4/22.
*/
@SpringBootApplication
@EnableEurekaServer
public class MiracleEurekaApplication1 {
public static void main(String[] args) {
setProfile("peer1");
SpringApplication.run(MiracleEurekaApplication1.class, args);
}
public static void setProfile(String active) {
String profile = "spring.profiles.active";
System.setProperty(profile, active);
}
}
在写一个MiracleEurekaApplication2
package com.miralcle.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by naonao on 18/4/22.
*/
@SpringBootApplication
@EnableEurekaServer
public class MiracleEurekaApplication2 {
public static void main(String[] args) {
MiracleEurekaApplication1.setProfile("peer2");
SpringApplication.run(MiracleEurekaApplication2.class, args);
}
}
相对应的配置文件和 和peer1类似,具体可见代码
启动两个application 输入licalhost:6201 查看