服务治理:Spring Cloud Eureka

服务治理

主要作用是实现各个微服务实例的自动化注册与发现。

服务注册

在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。

服务发现

由于在服务治理框架下运作,服务间的调用不再通过指定具体的实例地址来发现,而是通过向服务名发起请求调用实现。所以,服务调用在调用服务提供方接口的时候,并不知道具体的服务实例位置。因此,调用方需要向服务注册中心咨询服务,并获取所有服务的实例清单,以实现对具体服务实例的访问

Netfix Eureka

Eureka服务端,我们也称为服务注册中心,支持高可用配置,它依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
Eureka客户端,主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身的提供的服务并周期性地发送心跳来更新它的服务租约。

搭建服务注册中心

在pom.xml中引入必要的依赖内容

<dependencies>
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-s 七 arter-eureka-server</artifactid>
  </dependency>
</dependencies>
<dependencyManagemen七>
  <dependencies>
    <dependency>
      <groupid>org.springframework.cloud</groupid>
      <artifactid>spring-cloud-dependencies</artifactid>
      <version>Brixton.SRS</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagemen七>

通过@EnableEurekaServer注解启动一个注册服务中心提供给其他应用进行对话.

@EnableEurekaServer
@SpringBoo七Application
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class) .web(七rue).run (args);
    }
}

在默认设置下,该服务注册中心将自己作为客户端来尝试注册他自己,所以我们需要禁用它的客户端注册行为,需要在application.properties中增加以下配置:

server. port=l 111
eureka.instance.hostname = localhost
#是否设置为注册中心
eureka.client.register-with-eureka=false
eureka.client.fetch-registry = false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${serve
r.port}/eureka/

注册服务提供者

新建一个新的微服务@EnableEurekaServer
@SpringBoo七Application
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class) .web(七rue).run (args);
}
}应用,接着,修改pom.xml文件,增加Spring Cloud Eureka模块的依赖

<dependencies>
  <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boo七-starter-web</artifactid>
  </dependency>
  <dependency>
    <group工d>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-test</artifactid>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-eureka</artifactid>
  </dependency>
</dependencies>

<dependencyManagemen七>
  <dependencies>
    <dependency>
      <group工d>org.springframework.cloud</groupid>
      <artifactId>spring-cloud-dependencies</artifac七Id>
      <version>Brixton.SRS</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

然后,改造请求处理的接口,注入DiscoveryClient对象,

@RestController
public class HelloController {
  private final Logger logger=Logger.getLogger(getClass());
  @Autowired
  private DiscoveryClient client;
  @RequestMapping(value = "/hello", me七hod= RequestMethod.GET )
  public String index() {
    Service Instance instance = client.getLocalServiceinstance();
    logger.info("/hello, host:" + instance.getHost());
    return "Hello World";
  }
}

然后在主类中加上@EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现。

@EnableDiscoveryClient
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class) .web(七rue).run (args);
    }
}

最后,我们需要在application.properties配置文件中,通过spring.application.name属性来为服务命名,再通过eureka.client.serviceUrl.defaultZone属性指定服务注册中心

spring.application.name = hello-service
eureka.client.serviceUrl.defaultZone = http://localhost:llll/eureka/

高可用注册中心

Eureka Server的高可用实际上就是将自己作为服务像其他服务注册中心注册自己,这样就形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。

服务发现与消费

服务发现的任务由Eureka完成,服务消费的任务由Ribbon完成。Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端配置的ribbonServerList服务列表去轮询访问以达到均衡负载的作用。
在Eureka的服务治理体系下实现服务的发现与消费:
-启动两个服务注册中心:java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8081,java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8082
-创建Spring Boot的基础工程来实现服务消费者,在pom文件内添加如下依赖:

<parent>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-parent</artifac七Id>
    <version>l.3.7.RELEASE</version>
    <relativePath/> <1-- lookup paren七 from repository -->
</parent>
<dependencies>
  <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifac七Id>
  </dependency>
<!--添加eureka依赖-->
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-eureka</artifactid>
   </dependency>
<!--添加ribbon依赖-->
   <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-ribbon</artifactid>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupid>org.springframework.cloud</groupid>
      <artifactid>spring-cloud-dependencies</artifactid>
      <version>Brixton.SRS</version>
      <type>pom</type>
      <scope>impor七</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

创建应用主类ConsumerApplication,通过@EnableDiscoveryClient注解让该应用为Eureka客户端应用,以获得服务发现的能力,同时在该主类中创建RestTemplate的Spring Bean实例,并通过@LoadBalanced注解开启客户端负载均衡。

@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
  @Bean
  @LoadBalanced
  RestTemplate restTemplate() {
     return new RestTemplate();
  }
  public static void main(String[] args) {
    SpringApplication.run(ConsumerApplication.class, args);
  }
}

-创建ConsumerController类并实现/ribbon-consumer接口。在该接口中,通过在上面创建的RestTemplate来实现对HELLO-SERVICE服务提供的/hello接口进行调用。

@RestController
public class ConsumerController {
  @Autowired
  RestTemplate restTemplate;

@RequestMapping(value="/ribbon-consumer", method=RequestMethod.GET){
  return restTemplate.getForEntity("http://HELLO_SERVICE/hello", String.class).getBody();
  }
}

-在application.properties中配置Eureka服务注册中心的位置,,需要与之前的HELLO-SERVICE的ip一样,否则将无法发现该服务。

spring.application.name=ribbon-consumer
server.port=9000

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

-向htttp://localhost:9000/ribbon-consumer发起GET请求,成功则返回Hello World。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容