spring-cloud微服务之路(三):服务注册和发现之Eureka、Consul

        在上一篇spring-cloud微服务之路(二):Spring Boot 我们介绍了如何快速的使用 Spring Boot 搭建一个微服务项目,这一篇我们演示如何分别使用 Spring Cloud Eureka 和 Spring Cloud Consul 完成服务注册和发现的实现。

一:服务治理

        服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。为什么我们需要这么一个功能,比如有两个微服务 A 和 B ,其中 A 需要调用服务 B 来完成一个业务需求,为了实现服务 B 的高可用,无论采用服务端负载均衡还是客户端负载均衡,都需要手动维护服务 B 的实例清单。但是随着业务的发展,系统功能越来越复杂,响应的微服务也不断增加,我们的静态配置会变得越来越难以维护。并且面对不断发展的业务,我们的集群规模、服务的位置、服务的命名都有可能发生变化,如果还是手动维护,极易造成很多不可预知的错误,消耗大量的人力。

        这个时候服务治理的优势就体现出来,在服务治理架构中,通常会有一个注册中心,每个微服务向注册中心注册自己的服务,将主机号、版本号、通信协议等信息告知注册中心,比如我们有两个提供服务的 A 和 B, 待它们向注册中心注册完成以后,注册中心会出现两个服务,并且会通过心跳的方式检测这两个服务是否可用,如果不可用则剔除,达到排除故障的作用。同时由于在服务治理框架下运作,服务间的调用不再通过指定具体的实例地址实现,而是通过 服务名 发起请求调用实现,所以,服务调用方需要向服务注册中心咨询服务,应获取所有服务的实例清单,以实现对具体服务实例的调用。比如 A 服务对应的地址是192.168.0.1:8080 ,应用名为 spring-cloud-providerA ,B 服务对应的地址是 192.168.0.1:8081,应用名为spring-cloud-providerB,服务 C spring-cloud-providerC首先也向注册中心注册,然后发现两个提供服务的实例,通过服务应用名直接调用,不再关心这个服务在什么IP 和 PORT 上。

二:使用 Eureka 搭建服务注册中心

        1、首先,创建一个基础的 Spring Boot 项目,并在 pom.xml 中增加如下依赖:

<!--添加eureka服务注册依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

        在应用启动类上面增加 @EnableEurekaServer 注解开启服务治理服务器的实现,

@EnableEurekaServer
@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
	SpringApplication.run(SpringbootApplication.class, args);
    }
}

        2、在默认情况下,该服务注册中心也会将自己作为客户端来尝试注册自己,所以我们需要禁用它的客户端注册行为,只需要在 application.properties 文件中新增如下配置:

#在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,
spring.application.name=spring-cloud-eureka
server.port=8080
#表示是否将自己注册到Eureka Server,默认为true
eureka.client.register-with-eureka=false
#表示是否从Eureka Server检索服务,默认为true,因为自己是维护服务的实例,不需要检索服务,设置为false
eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

        3、在完成上面的配置后,启动应用并访问 http://localhost:8080 就可以看到 Eureka 的信息面板,可以看到还没有服务注册到注册中心。



扫描二维码关注公众号,回复: 2035846 查看本文章

二:注册服务提供者

        1、在完成服务注册中心的搭建之后,接下来我们尝试将一个 Spring Boot 应用加入到 Eureka 的服务治理体系中去。新建 Spring Boot 项目 eureka-provider ,修改 pom.xml ,增加 Spring Cloud Eureka 模块的依赖:

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

        2、接着创建 ProviderController,增加 index 接口,接收 name 参数,输出 ‘hello’+ name + 'this is first message'

@RestController
public class ProviderController {

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String index(@RequestParam(value = "name") String name){
        return "hello" + name + ", this is the first message";
    }
}

        3、然后在主启动类上面增加 @EnableDiscoveryClient 注解开启 Eureka 中的 DiscoveryClient 实现,注意:这一块也可以使用 @EnableEurekaClient 注解,具体两者之间的区别请参考 @EnableDiscoveryClient和@EnableEurekaClient区别 

//spring-cloud-starter-eureka 和 spring-cloud-starter-consul-discovery
//均包含次注解
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaProviderApplication {

    public static void main(String[] args) {
	SpringApplication.run(EurekaProviderApplication.class, args);
    }
}

        4、最后我们需要在 application.properties 配置文件中,通过 spring.application.name 属性来为服务命名,比如命名为spring-cloud-producer , 再通过 eureka.client.service-url.defaultZone 属性来指定服务注册中心的地址,也就是我们上面应用的地址:

spring.application.name=spring-cloud-producer
server.port=8081
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/

        5、下面我们分别启动刚开始创建的服务注册中心应用和服务注册提供者应用,浏览器输入 http://localhost:8080/就可以看到服务已经注册到服务中心。

三:服务发现与消费

        通过上面的内容,我们已经搭建起服务注册中心和服务注册,服务发现的任务是由 Eureka 的客户端实现,而消费的任务则是由 Ribbon 实现,Ribbon 是一个客户端的负载均衡器。

        1、首先,我们将上面创建的 eureka-provider 打成 jar 包  后使用命令分别启动两个不同的端口运行:

            java -jar eureka-provider-0.0.1-SNAPSHOT.jar --server.port=8081

            java -jar eureka-provider-0.0.1-SNAPSHOT.jar --server.port=8082

        2、在分别启动成功后,如下图所示,从 Eureka 信息面板中我们看到名 SPRING-CLOUD-PRODUCER 的服务出现了两个实例单元,端口分别是 8081 和 8082:


        3、创建一个 Spring Boot 项目来实现服务消费者,取名为 ribbon-consumer ,并在 pom.xml 中引入如下的依赖内容,和以前的 eureka-provider 相比,我们新增了 Ribbon 模块的依赖 spring-cloud-starter-ribbon:

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

<!--添加客户端负载均衡组件ribbon ribbon调用方式-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

        4、在应用主启动类中增加 @EnableDiscoveryClient 注解让该应用注册为 Eureka 客户端应用,同时在该类中创建 RestTemplateSpring Bean 实例,并通过 @LoadBalanced 注解开启客户端的负载均衡。

//启用服务注册与发现
@EnableDiscoveryClient
//注意:这里可以使用@SpringCloudApplication注解,
// 此注解包含@EnableDiscoveryClient/@SpringBootApplication/@EnableCircuitBreaker三个注解
@SpringBootApplication
public class RibbonConsumerApplication {

    public static void main(String[] args) {
	SpringApplication.run(RibbonConsumerApplication.class, args);
    }

    /**
    * 添加ribbon客户端负载均衡组件
    * @return RestTemplate实例
    */
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
	return new RestTemplate();
    }
}

        5、创建 ConsumerController 类提供 /ribbon-consumer 接口,在该接口中通过上面创建的 RestTemplate 来实现对SPRING-CLOUD-PRODUCER 服务提供的 /hello 接口进行调用。可以看到我们这里访问的是服务名 SPRING-CLOUD-PRODUCER ,而不是一个地址,这是一个非常重要的特性

@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
    public String index(@RequestParam(name = "myname") String myname){
        //restTemplate.getForObject("http://SPRING-CLOUD-PRODUCER/hello?name={1}",String.class,myname);第一种写法
        //下面是第二种写法,注意这种写法,不能这么写:getForObject("http://SPRING-CLOUD-PRODUCER/hello?name={xm}",String.class,new Hashmap<>().put("xm",myname));
        Map<String,String> params = new HashMap<>();
        params.put("xm",myname);
        String result = restTemplate.getForObject("http://SPRING-CLOUD-PRODUCER/hello?name={xm}",String.class,params);
        return result;
    }
}

        6、在配置文件中将此应用注册到Eureka注册中心:

spring.application.name=spring-ribbon-consumer
server.port=2222
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/

        7、启动应用,发现此消费应用已经成功注册:


        8、通过访问 http://localhost:2222/ribbon-consumer?myname=测试   发起GET请求,成功返回 hello测试,this is first message 信息,并且实现了请求轮询,实现了负载均衡(大家可以将两个提供者的输出语句打印不同,这样更加直观)。


四:服务注册和发现之Consul实现

        待续。。。



猜你喜欢

转载自blog.csdn.net/white_ice/article/details/80089276