第一篇:服务的注册与发现Eureka(Finchley版本)

一 springcloud简介 

  目前的springcloud的版本 Finchley.RELEASE springboot的版本 2.0.3.RELEASE 

Finchley版本的官方文档如下: 

http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的,所以需要开发中对springboot有一定的了解。另外对于“微服务架构” 不了解的话,可以通过搜索引擎搜索“微服务架构”了解下!

二 创建服务注册中心

在这里,我还是采用Eureka作为服务注册与发现的组件,至于其他的服务发现组件之后会出文章详细介绍。

2.1 首先创建一个maven主工程。

  首先创建一个主Maven工程,在其pom文件引入依赖,spring Boot版本为2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom。这一系列文章全部采用这种模式,其他文章的pom跟这个pom一样。再次说明一下,以后不再重复引入

2.2 创建eureka-server Module

  

  

  

  继续next 创建eureka-server Module 其依赖如下:

  

<?xml version="1.0" encoding="UTF-8"?>
<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>com.hmzj</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>EurekaServer project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

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

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
@EnableEurekaServer //开启EurekaServer 
@SpringBootApplication
public class EurekaServerApplication {

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

 2.3 Eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。eureka server的配置文件appication.yml:

  

server:
  port: 8060
spring:
  application:
    name: eureka-server
eureka:
  server:
    enable-self-preservation: true # 测试时关闭自我保护机制,保证不可用服务及时踢出
  client:
    register-with-eureka: false 
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://127.0.0.1:8060/eureka/

通过eureka.client.registerWithEurekafalsefetchRegistryfalse来表明自己是一个eureka server.

2.4 eureka server 是有界面的,启动工程,打开浏览器访问: http://localhost:8060 ,界面如下:

 

No application available 没有服务被发现 因为没有注册服务。

  到此一个简单的服务端就完成了!

三 Eureka Server加上安全验证

  1. 引入依赖 
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

  2.application.yml中添加配置

spring:
  security:
    user:
      name: **
      password: **

修改defaultZone: http://pyq:123456@localhost:8060/eureka/  

serviceUrl格式:http://<username>:<password>@ip:port/eureka

  

# 此种方法已经过时   
security:    
  basic:    
    enabled: true    
  user:    
    name: admin  # 用户名    
    password: admin123   # 用户密码

  3.由于Finchey版本默认开启csrf  为了可以使用 http://${userName}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,写一个配置类

package com.hmzj.eurekaserver;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
        http.csrf().disable(); //关闭csrf
        //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,如果是form方式,不能使用url格式登录
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); //开启认证
    }

}

   4.此时再重新启动eureka-server 打开浏览器访问: http://localhost:8060  就需要账号和密码了  

 四 高可用的服务注册中心 (双注册节点)

   

新建一个application-peer1.yml和application-peer2.yml

server:
  port: 8060
spring:
  application:
    name: eureka-server
  security:
    user:
      name: **
      password: **
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    register-with-eureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://**:**@127.0.0.1:8061/eureka/ #注意端口
 

 注意:在使用双节点注册时应在注册时将 defaultZone: http://**:**@127.0.0.1:8061/eureka/ 的端口写成另外一个节点的端口

server:
  port: 8061
spring:
  application:
    name: eureka-server
  security:
    user:
      name: **
      password: **
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    register-with-eureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://**:**@127.0.0.1:8060/eureka/ #注意端口

按照官方文档的指示,需要改变etc/hosts,linux系统通过vi /etc/hosts ,加上:
127.0.0.1 peer1

127.0.0.1 peer2

windows电脑,在c:/windows/systems/drivers/etc/hosts 修改

linux上将eureka-server打包 编译后  运行jar包

nohup java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 >/dev/null 2>&1 &

nohup java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2 >/dev/null 2>&1 &

 

 

 完美注册!

猜你喜欢

转载自www.cnblogs.com/pangyangqi/p/9389865.html
今日推荐