Spring Cloud 微服务Eureka注册中心-服务注册与发现

服务注册与发现

0.服务的注册与发现

流程图

关系调用说明
  • 服务生产者启动时,向注册中心注册自己提供的服务;
  • 服务消费者启动时,在注册中心订阅自己所需要的服务;
  • 注册中心返回服务提供者的地址信息给消费者;
  • 消费者从服务提供者中调用服务;
1.Eureka简介
  • Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Spring Boot构建的微服务很容易的整合起来。
  • Eureka包含了服务器端和客户端组件。
  • 服务器端,也被称作是服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。
  • 客户端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。
2.搭建服务注册中心

创建一个Spring Boot项目,勾选Eureka Server的依赖:
在这里插入图片描述

如果建项目时忘记勾选,在pom.xml中加入以下依赖即可

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

接下来编写配置文件,我个人采用了YML格式的配置文件,但Spring Boot项目默认生成的是application.properties文件,不过两者并无本质区别:

spring:
  application:
    name: eureka-server # 设置服务名
server:
  port: 9003 # 端口号
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9003/eureka/
    # 是否从eureka上获取注册信息
    fetch-registry: false
    # 表示是否注册自身到 eureka服务器
    register-with-eureka: false

Spring Boot启动类加入注解:

@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class Test2Application {

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

}

接下来启动项目,打开浏览器访问我们刚才设置的端口号,我这里定义的是9003:
在这里插入图片描述看到这个页面就说明Eureka注册中心已经成功的搭建好了。

2.创建服务提供者,并注册到服务注册中心

创建一个新的Spring Boot项目,勾选Web和Eureka Discovery依赖:
在这里插入图片描述
在这里插入图片描述
pom.xml中的依赖如下:

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

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

在Spring Boot的启动类上加上注解以实现Eureka中的Discovery Client实现,注解有以下两种,如果使用的是Eureka注册中心的话用第一种注解比较好,如果使用的注册中心不是Eureka那就使用第二种注解,具体的底层原理就不在这里细说了,由于我们用的是Eureka注册中心,所以我们就用第一种注解来演示:

@EnableEurekaClient

@EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient
public class TestPdrApplication {

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

}

接下来编写配置文件:

spring:
  application:
    # 设置服务名称
    name: test-pdr
eureka:
  client:
    service-url:
      # 设置注册中心的地址,端口9003是我们定义的eureka的端口号
      defaultZone: http://127.0.0.1:9003/eureka/
server:
  port: 9009

然后我们可以进行测试一下,首先把注册中心给启动,再启动服务提供者,然后我们就可以打开浏览器访问127.0.0.1:9003查看注册结果:
在这里插入图片描述
这里我们发现Eureka中多了一条信息,Application下面的TEST-PDR就是我们自己写的服务提供者,后面端口号9009也是我们自己定义的,这说明我们的服务提供者已经成功的注册进了注册中心;

3.开启注册中心的密码验证(2.x版本的写法)

之前我们的注册中心并没有开启密码验证,只需要知道地址,谁都可以注册进去,安全性并不高,所以我们在注册中心里面加入密码验证来确保安全性,打开Eureka注册中心的pom文件,
在pom.xml中加入以下依赖:

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

在application配置文件中加入以下密码设置,(与1.x版本不同)具体写法如下:

spring:
  # 在这里加入节点security
  security:
    user:
      name: admin # 用户名
      password: 123456 # 密码
  application:
    name: eureka-server
server:
  port: 9003
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9003/eureka/
    # 是否从eureka上获取注册信息
    fetch-registry: false
    # 表示是否注册自身到eureka服务器
    register-with-eureka: false

配置文件改好之后打开Spring Boot启动类,让启动类继承 WebSecurityConfigurerAdapter 这个类,并重写configure方法,Spring Security默认开启了所有 CSRF 攻击防御,需要禁用 /eureka 的防御:

@SpringBootApplication
@EnableEurekaServer
public class Eureka1Application extends WebSecurityConfigurerAdapter {

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        super.configure(httpSecurity);
        httpSecurity.csrf().disable();
    }
}

到这里 Eureka 注册中心就已经成功的开启了密码认证,那么其他模块如果想要注册进Eureka就不只是需要知道地址了,还需要知道正确的用户名和密码,否则是注册不进去的,拿我们刚才写的服务提供者为例,先修改服务提供者的配置文件:

eureka:
  client:
    service-url:
      # 设置注册中心的地址,端口9003是我们定义的eureka的端口号
      defaultZone: http://admin:123456@127.0.0.1:9003/eureka/
      # admin是我们设置的用户名,123456为密码,

再次启动Eureka注册中心,浏览器访问后会看到以下页面(版本不同可能会有不同的页面样式),会出现一个登陆表单:
在这里插入图片描述
输入我们的用户名和密码进入注册中心:
在这里插入图片描述
这个时候才算是成功的进入了注册中心,加了一道密码验证,如果密码输入错误是没法进来的,如图:
在这里插入图片描述
有效的提高了Eureka的安全性,刚才我们已经在服务提供者的配置文件里面加入了用户名和密码了,所以现在可以直接启动服务提供者看看效果:
在这里插入图片描述
这个时候服务提供者就成功注册进去了,因为我们提供了正确的用户名和密码,如果服务提供者里并没有加入用户名和密码,或者用户名和密码不正确的话,控制台就会出现以下报错:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
	at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1051) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:965) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1479) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient$CacheRefreshThread.run(DiscoveryClient.java:1446) [eureka-client-1.9.8.jar:1.9.8]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]

出现异常:com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
意思就是告诉你:无法在任何已知服务器上执行请求!说简单点就是注册中心密码写错了,人家不让它访问了。
Eureka开启密码验证到这里就结束了。感谢大家支持!

欢迎关注微信公众号"程序员小辉"

微信图片20190813101011.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值