您的位置:首页 > 编程语言 > Java开发

spring cloud(二)之注册中心(EUREKA)

2018-01-11 15:47 369 查看
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry(注册中心)和Service Discovery(发现服务)实现。也是springcloud体系中最重要最核心的组件之一。


背景介绍

服务中心

服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

有了服务中心调用关系会有什么变化,画几个简图来帮忙理解

项目A调用项目B

正常调用项目A请求项目B


有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用 

    


项目A调用项目B,项目B在调用项目C


这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。



上面的项目只是两三个相互之间的简单调用,但是如果项目超过2
4000
0个30个呢,在15年底的时候我司分布式的项目就达到了二十几个,画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。

Eureka

按照官方介绍:

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.
Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

用一张图来认识以下:



上图简要描述了Eureka的基本架构,由3个角色组成:

1、Eureka Server
提供服务注册和发现

2、Service Provider
服务提供方
将自身服务注册到Eureka,从而使服务消费方能够找到

3、Service Consumer
服务消费方
从Eureka获取注册服务列表,从而能够消费服务


案例实践(创建一个注册中心并把服务往注册中心注册)

一、创建一个注册中心
在pom.xml中引入依赖的jar包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>SPRINGCLOUD_EUREKASERVER</artifactId>
<version>0.0.1-SNAPSHOT</version>

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

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<!-- 注册中心 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>

</project>


在资源文件目录下创建一个application.yml(该文件格式非常严谨  不能使用tab键  必须使用空格  此格式和树结构类似  一行中不能有多余不必要的符号)

server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/#服务注册的地址  该地址用于服务的注册


启动服务注册中心

package cn.et;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//注册中心
@SpringBootApplication
@EnableEurekaServer
public class Main {

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


在浏览器中输入http://localhost:8761/  就可以查看注册中心(此时注册中心还没有服务注册上去 接下来我们试着往注册中心注册服务)



此监控中心还可以设置账号密码来控制权限   在application.yml中修改为

server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ security:
basic:
enabled: true
user:
name: 123
password: 123

并在pom.xml中增加添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>

如图



二、在创建一个项目用于往注册中心注册(发送邮件为例)
1.在pom.xml中引入依赖的jar包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>SPRINGBOOT-SENDMAIL</artifactId>
<version>0.0.1-SNAPSHOT</version>

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

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

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

<!-- 发送邮件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<!-- 发布到注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

</dependencies>
</project>


2.在资源文件目录下创建一个application.properties文件

#字符集有时候启动会报错  建议可以不用加
spring.mail.default-encoding=UTF-8
#是smtp服务器的地址
spring.mail.host=smtp.126.com
#发送者的邮箱密码  开通smtp的令牌密码
spring.mail.password=123
#邮箱的端口
spring.mail.port=25
#通过何种协议发送
spring.mail.protocol=smtp
#发送者的邮箱账号
spring.mail.username=p1193@126.com
#注册到注册中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#服务注册到注册中心的名字  名字包含了ip地址和端口
spring.application.name=email
#服务程序的端口
server.port=8082

3.程序

package cn.et;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Mailcontroller {

@Autowired
JavaMailSender jms;

@GetMapping("/send")
public String send(){
SimpleMailMessage smm=new SimpleMailMessage();
//发送者
smm.setFrom("p1193@126.com");
//接收者
smm.setTo("接收者邮箱名");
//标题
smm.setSubject("测试邮件");
//内容
smm.setText("hello");

jms.send(smm);

return "发送成功";
}
}

4.启动服务往注册中心注册

package cn.et;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class Main {

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


把服务的application.properties文件中的端口改为8081并在此启动  这样就注册了两个服务在注册中心(如下图)



<
ba10
/div>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: