SpringCloud构建微服务架构:服务注册与发现

1.什么是Spring Cloud

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操做提供了一种简单的开发方式。web

Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不一样开源产品),好比:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。spring

2.微服务架构

“微服务架构”在这几年很是的火热,以致于关于微服务架构相关的开源产品被反复的说起(好比:netflix、dubbo),Spring Cloud也因Spring社区的强大知名度和影响力也被广大架构师与开发者备受关注。bash

那么什么是“微服务架构”呢?简单的说,微服务架构就是将一个完整的应用从数据存储开始垂直拆分红多个不一样的服务,每一个服务都能独立部署、独立维护、独立扩展,服务与服务间经过诸如RESTful API的方式互相调用。架构

对于“微服务架构”,能够阅读始祖Martin Fowler的《Microservices》(中文版翻译点击查看)app

3.Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。经过一些简单的注解,开发者就能够快速的在应用中配置一下经常使用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。负载均衡

下面,就来具体看看如何使用Spring Cloud Eureka实现服务治理。分布式

3.1 建立“服务注册中心”

建立一个基础的Spring Boot工程,命名为 eureka-server ,并在 pom.xml 中引入须要的依赖内容:spring-boot

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>Dalston.SR1</version>
           <type>pom</type>
           <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
复制代码复制代码

经过 @EnableEurekaServer 注解启动一个服务注册中心提供给其余应用进行对话。这一步很是的简单,只须要在一个普通的Spring Boot应用中添加这个注解就能开启此功能,好比下面的例子:微服务

@SpringBootApplication
@EnableEurekaServer
public class SpringclouddemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringclouddemoApplication.class, args);
    }
}
复制代码复制代码

在默认设置下,该服务注册中心也会将本身做为客户端来尝试注册它本身,因此咱们须要禁用它的客户端注册行为,只须要在 application.properties 配置文件中增长以下信息:工具

spring.application.name=eureka-server
server.port=1001

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
复制代码复制代码

为了与后续要进行注册的服务区分,这里将服务注册中心的端口经过server.port属性设置为1001。启动工程后,访问: http://localhost:1001/ ,能够看到下面的页面,其中尚未发现任何服务。

3.2 建立“服务提供方”

下面咱们建立提供服务的客户端,并向服务注册中心注册本身。

首先,建立一个基本的Spring Boot应用。命名为 eureka-client ,在 pom.xml 中,加入以下配置:

<parent> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>Dalston.SR1</version>
           <type>pom</type>
           <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
复制代码复制代码

而后,建立/dc请求处理接口,经过DiscoveryClient对象,在日志中打印出服务实例的相关内容。

@RestController
public class DcController {

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("/dc")
    public String dc() {
        String services = "Services: " + discoveryClient.getServices();
        System.out.println(services);
        return services;
    }
}
复制代码复制代码

最后在应用主类中经过加上 @EnableDiscoveryClient 注解,该注解能激活Eureka中的DiscoveryClient实现,这样才能实现Controller中对服务信息的输出。

@EnableDiscoveryClient
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(
            ComputeServiceApplication.class)
            .web(true).run(args);
    }
}
复制代码复制代码

咱们在完成了服务内容的实现以后,再继续对 application.properties 作一些配置工做,具体以下:

经过 spring.application.name 属性,咱们能够指定微服务的名称后续在调用的时候只须要使用该名称就能够进行服务的访问。 eureka.client.serviceUrl.defaultZone 属性对应服务注册中心的配置内容,指定服务注册中心的位置。为了在本机上测试区分服务提供方和服务注册中心,使用 server.port 属性设置不一样的端口。

启动该工程后,再次访问: http://localhost:1001 。以下图,就注册成功了。

咱们也能够经过直接访问 eureka-client 服务提供的 /dc 接口来获取当前的服务清单,只须要访问: http://localhost:2001/dc,能够获得一下输出:

其中,方括号中的 eureka-client 就是经过Spring Cloud定义的 DiscoveryClient 接口在eureka的实现中获取到的全部服务清单。

还能够参考spring cloud

相关文章
相关标签/搜索