文档章节

J360-cloud SpringCloud系列二:服务发现Discovery Service

Hi徐敏
 Hi徐敏
发布于 2015/10/10 22:15
字数 1156
阅读 5.1K
收藏 8

精选30+云产品,助力企业轻松上云!>>>

j360开源博客之

----------------------------------------------------------

J360-Cloud系列

spring-cloud快速入门工程之j360-cloud-all:(欢迎star、fork

https://github.com/xuminwlt/j360-cloud-all


spring cloud系列博客

(oschina首页推荐)J360-cloud SpringCloud系列一:分布式配置服务器ConfigServer


服务发现Discovery Service

Discovery Service 是另一个重要的微服务架构的组件.Discovery Service管理运行在容器中的众多服务实例,而这些实例工作在集群环境下.在这些应用中,我们使用客户端的方式称之为从服务到服务

discovery service细分为3个部分:

  1. EurekaServer 服务注册服务器

  2. EurekaService 服务提供方,服务启动时会向注册服务器server注册该服务,服务通过rest形式提供api接口

  3. EurekaClient 服务客户端,通过restTemplate、Feign完成调用


Feign声明式 REST Client

    Spring Cloud整合Ribbon和Eureka提供负载均衡的http client时使用Feign.


【注】:本案例中使用了第一节的configserver。当然可以把这个环节的配置去掉,可以分别独立使用

EurekaServer

1、注解:

@EnableEurekaServer

2、bootstrap.yml/application.yml

---
server:
  port: 8761

spring:
  application:
    name:eurekaserver
  cloud:
    config:
      uri:http://localhost:8888

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
            defaultZone: http://localhost:8761/eureka/

spring.cloud.config.discovery.enabled: true


EurekaClient

1、注解

@EnableEurekaClient

2、bootstrap.yml/application.yml

---
server:
  port: 8080

spring:
  application:
    name: eurekaclient
  cloud:
    config:
      enabled: true
      uri: http://localhost:8888

eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10
    metadataMap:
      instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}}
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

3、使用api

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
    return instance.getHomePageUrl();
}


Feign实施

package me.j360.cloud.eurekaclient.feign;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

/**
 * Created with j360-cloud-all -> me.j360.cloud.eurekaclient.feign.
 * User: min_xu
 * Date: 2015/10/9
 * Time: 10:49
 * 说明:映射到service中的hello rest,在controller中直接调用helloClient即可
 */

@FeignClient("eurekaservice")
public interface HelloClient {
    @RequestMapping(value = "/", method = GET)
    String hello();
}

在controller中调用,这里的案例只调用hello方法,关于hystrix调用将在下一个系列中描述

package me.j360.cloud.eurekaclient.controller;

import me.j360.cloud.eurekaclient.feign.HelloClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created with j360-cloud-all -> me.j360.cloud.eurekaclient.controller.
 * User: min_xu
 * Date: 2015/10/9
 * Time: 10:53
 * 说明:
 */

@RestController
public class HelloController {

    @Autowired
    @Qualifier("helloClient")
    HelloClient client;

    @Autowired
    @Qualifier("hystrixHelloClient")
    HelloClient hytrixClient;

    /**
     * 直接调用feign,feign会去调用eurekaService
     * */
    @RequestMapping("/")
    public String hello() {
        return client.hello();
    }

    /**
     * 1、调用hytrix
     * 2、hytrix继承并调用feign
     * 3、feign会去调用eurekaService
     * */
    @RequestMapping("/hytrix")
    public String hytrixHello() {
        return hytrixClient.hello();
    }

}

运行

按顺序运行server、service、client,可以打开eurekaserver的监视器页面

将eurekaservice按照集群的方式运行,修改port之后再执行一次,分别为8081/8082,,在执行localhost:8080查看运行的结果如下

Hello World: eurekaservice:min_xu:8081

Hello World: eurekaservice:min_xu:8082

可以看到,feign在执行时已经通过Ribbon实现了客户端的负载均衡,此时共运行了5台服务器,实现基于微服务的分布式架构的雏形结构,分别为

  1. configserver

  2. eurekaserver

  3. eruekaservice1

  4. eurekaservice2(集群可扩展并实现负载均衡)

  5. eurekaclient

那么问题来了,如何实现高可用高质量的微服务api的调用,下一节介绍netflix利器:hytrix,该框架在基于springboot的微服务架构项目中有描述:

j360-microservice

在springcloud中,hytrix通过spring start方式集成,使用起来更加方便。


【附】

SpringCloud提供了另外一种服务发现框架,spring-cloud-zookeeper,同样其中使用了负载均衡Robbin+Feign组合使用,依然Hytrix也可以组合使用,spring-cloud-zookeeper还未同步到1.0.3版本,介绍文档也只有个标题,但是依然不凡读读源码,跑个test,了解其中的不同之处:

在使用Eureka框架时,使用@EnableDiscoveryClient+eureka=@EnableEurekaClient

在使用zookeeper框架时:使用@EnableDiscoveryClient

同样还有另一个非常流行的服务发现框架:consul,这三种框架都可以作为spring-cloud服务发现的实现框架,以后有机会补充。


spring-cloud-zookeeper补充

看看官方对于springc-cloud-zookeeper的功能介绍:

Spring Cloud Zookeeper features:

  • Service Discovery: instances can be registered with Zookeeper and clients can discover the instances using Spring-managed beans

    • Supports Ribbon, the client side load-balancer via Spring Cloud Netflix

    • Supports Zuul, a dynamic router and filter via Spring Cloud Netflix

  • Distributed Configuration: using Zookeeper as a data store

  1. 服务发现:实例使用zookeeper注册,并且客户端通过spring-beans可以发现该实例

  2. 分布式配置:仅仅作为data store


spring-cloud-cluster补充

相当的杯具:spring-cloud集群管理模块还在写代码,还没有完成start模块,简单介绍下

Spring Cloud Cluster offers a set of primitives for building "cluster" features into a distributed system. Example are leadership election, consistent storage of cluster state, global locks and one-time tokens.

用了zookeeper、redis、hazelcast三个服务

使用场景:分布式锁、选举、集群状态管理、一次性令牌


Hi徐敏
粉丝 127
博文 40
码字总数 67954
作品 0
静安
架构师
私信 提问
加载中
此博客有 3 条评论,请先登录后再查看。
【Spring Cloud】分布式必学springcloud(一)——简介和看法

一、前言 开篇之前,我想说,springcloud会完胜dubbo。 小编以前做分布式是用的webservice、dubbo。最近的项目中,开始使用了springcloud,springcloud包含了很多的组件,这些组件是dubbo没有...

kisscatforever
2018/04/16
0
0
跟我学SpringCloud | 第二篇:注册中心Eureka

SpringCloud系列教程 | 第二篇:注册中心Eureka Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全采用以上版本 Eureka是Netflix开源的一款提供服务注册和发...

osc_eibr31r7
04/16
27
0
SpringBoot整合SpringCloud搭建分布式应用

什么是SpringCloud?   SpringCloud是一个分布式的整体解决方案。SpringCloud为开发者提供了在分布式系统中快速构建的工具,使用SpringCloud可以快速的启动服务或构建应用、同时能够快速和...

osc_f8mjcido
2019/02/16
2
0
spring-cloud-kubernetes与SpringCloud Gateway

本文是《spring-cloud-kubernetes实战系列》的第五篇,主要内容是在kubernetes上部署一个SpringCloud Gateway应用,该应用使用了spring-cloud-kubernetes框架,可以将请求转发到kubernetes环...

osc_snzhxf3u
04/16
28
0
SpringCloud使用Nacos服务发现实现远程调用

本文使用SpringCloud结合Nacos服务发现,Feign远程调用做一个简单的Demo。 1 Nacos 关于Nacos之前写了两篇文章关于SpringBoot对它的使用,感兴趣可以查看一下。 《SpringBoot使用Nacos配置中...

大老杨
2019/03/11
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

你看起来很好吃

你看起来很好吃 本文分享自微信公众号 - ZackSock(ZackSock)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

ZackSock
2019/10/25
19
0
Python绘制日历图和热力图

日历热力图 实现某商店2018年10月1号至2019年3月1号期间每一天盈利额(产生5000至30000区间的随机数)的数据可视化。 要求在鼠标放置每个单元格上时显示具体日期和对应数据 import datetime ...

气象学家公众号
07/03
10
0
#乔布简历#计协纳新季福利!乔布简历20元会员卡免费送

#乔布简历#计协纳新季福利!@乔布简历 20元会员卡免费送!活动规则:1)转发本微博/说说@ 三个好友;2)搜索关注“乔布堂”微信公众号,回复“BC016@你的QQ号”;截图发给计协微信公众号:j...

若川
2014/09/22
12
0
第十一届蓝桥第一场省赛题 走方格

走方格 问题描述: 在平面上有一些二维的点阵。这些点的编号就像二维数组的编号一样。从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。现在有...

osc_kf7nv2km
23分钟前
29
0
HTTP/2协议之Stream【原理笔记】

前言 前面三篇介绍了HPPT/2的“连接前言”、“二进制桢”、“头部压缩”。本文从“流及多路复用”、“流状态”、“流量控制”、“流优先级”、“HTTP/2扩展”介绍HTTP/2协议流相关知识。 一、...

瓜农老梁
05/31
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部