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

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

背景介绍

服务中心

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

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

项目A调用项目B

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

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

    

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

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


上面的项目只是两三个相互之间的简单调用,但是如果项目超过20个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并在此启动  这样就注册了两个服务在注册中心(如下图)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值