服务治理
服务治理是微服务中最核心和最基础的模块,用于各个微服务的注册和发现功能。在系统发展的初期可能由于模块不多,完全可以通过一些静态配置文件保存各个服务的地址,在各个项目中手工维护一份服务的实例清单。其实技术没有好与坏之分,只有适合与不适合,如果你的公司规模不大,拆分的服务项目一只手就数的过来,那为了顺应微服务的潮流而引入了一套spring cloud完全是加重项目负担,没有任何实际意义。但是相反,如果公司规模越来越大,拆分的服务越来越多,系统功能逐渐复杂,继续采用静态配置的方式就会非常难以维护,而且万一某个服务需要迁移或者变动,会产生牵一发而动全身的效果,相应的调用方都需要修改配置,所以遵从计算机领域真理,没有什么是加一个中间层不能解决的,注册中心这样的模块应运而生。
- 服务注册
服务治理框架中通常都会有一个注册中心,各个服务端像注册中心登记自己以及提供的服务,包括主机、端口号、版本号甚至服务协议等信息,由注册中心来维护各个服务实例的实例清单。另外注册中心还会通过心跳的方式检测实例健康程度,在实例不可用后会将实例剔除。 - 服务发现
相应的服务调用的时候肯定不会再是直接进行实例调用,而是会通过服务名称的方式向注册中心发出请求,获取实例清单以进行调用或访问
搭建服务注册中心
Spring Cloud Eureka,使用Netfilx Eureka来实现服务的注册与发现,Spring Cloud项目是基于Spring Boot项目搭建的,网上有非常多关于搭建SpringBoot项目的相关的而且使用非常简单,这里不再赘述,我使用的项目管理工具的gradle,在build.gradle文件中加入如下代码:
plugins {
id 'org.springframework.boot' version '2.1.3.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'org.zyc.springcloud'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
ext {
set('springCloudVersion', 'Greenwich.RELEASE')
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
启动一个服务注册中心页非常简单,可以通过@EnableEurekaServer注解启动,在SpringBoot启动类中加入这个注解即可
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在默认设置中,服务注册中心会把自身作为客户端来尝试注册自己,可以通过配置项进行配置,同时为了区分后续可能启动的其他服务注册中心,这里通过设置端口号的方式进行区分,在项目的application.properties中设置即可,为了便于区分不同环境的配置,我们这里新建一个application-peer1.properties,作为第一个配置中心的配置文件
spring:
application:
name: eureka-server
server:
port: 1111
eureka:
instance:
hostname: peer1
配置完成后启动SpringBoot项目即可,注意启动时加入启动应用参数–spring.profiles.active=peer1,用于区分使用配置文件,此时http://localhost:1111 即可访问服务注册中心
注册服务提供者
既然服务注册中心搭建完成,但是空有一个注册中心毫无意义,重要的是提供服务,所以我们现在可以尝试像注册中心注册一个服务的提供者,依旧类似于之前的方式生成一个SpringBoot项目,我们新建一个hello-service项目当作服务的提供者,build.gradle文件中稍作修改,加入如下依赖
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
为了测试服务提供效果,我们简单的写一个HelloController,通过接口返回一个hello字符串即可
@RestController
public class HelloController {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "Hello World";
}
}
马上就要大功告成了,最后在启动类加上注解@EnableDiscoveryClient,这样代码我们就完成了,但是到这里还不够,既然是要将服务提供者注册到服务注册中心,那么首先肯定要让提供者知道像哪里注册,所以还需要在application.properties中配置一下注册中心的url
server.port=2222
spring.application.name=hello-service
eureka.client.service-url.defaultZone = http://peer1:1111/eureka/
这里我们指定了端口号为2222,服务名字为hello-service以及刚刚搭建的eureka,这里完成后我们可以启动一下hello-service项目,在启动日志中应该可以看到如下信息,说明我们的服务已经注册成功了,同时在刚刚的eureka管理页面http://localhost:1111 中Instances currently registered with Eureka一栏中应该可以看到我们hello-service的注册信息了
DiscoveryClient_HELLO-SERVICE/192.168.56.1:hello-service:2222: registering service...
DiscoveryClient_HELLO-SERVICE/192.168.56.1:hello-service:2222 - registration status: 204
Tomcat started on port(s): 2222 (http) with context path ''
Updating port to 2222
Started HelloServiceApplication in 6.352 seconds (JVM running for 16.223)
通过访问http://localhost:2222/hello 可以看到返回了hello world,那么至此,我们就拥有了一个服务注册中心和一个注册的服务,可以说,一个最简单微服务系统已经搭建了