SpringCloud使用Eureka进行服务治理

小波 4月前 ⋅ 801 阅读

一、服务的注册与发现

关系调用说明:

     服务生产者启动时,向服务注册中心注册自己提供的服务

     服务消费者启动时,在服务注册中心订阅自己所需要的服务

     注册中心返回服务提供者的地址信息给消费者

     消费者从提供者中调用服务

二、Eureka简介

Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Springboot构建的微服务很容易的整合起来。

Eureka包含了服务器端和客户端组件。服务器端,也被称作是服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它

允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。

客户端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息

并把他们缓存到本地并周期性的刷新服务状态。

三、使用Eureka进行服务治理

  1. 搭建服务注册中心

         单独创建一个Springboot项目,并添加如下的依赖

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


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

在Springboot项目中的main入口,添加@EnableEurekaServer注解,来开启服务注册中心

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

@EnableEurekaServer
@SpringBootApplication
public class SpringcloudApplication {

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

在默认情况下,服务注册中心也会把自己当做是一个服务,将自己注册进服务注册中心,所以我们可以通过配置来禁用他的客户端注册行为,在application.properties中添加如下配置

server.port=666
#不要向注册中心注册自己
eureka.client.register-with-eureka=false
#禁止检索服务
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

启动应用,并访问http://localhost:666

2. 注册服务

         在另外Springboot项目pom文件中添加Eureka客户端相关的依赖

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

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

org.springframework.cloud.client.discovery.DiscoveryClient;对象注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.net.URI;

/**
 * @Author Chengbo
 * @Email nanchong360@gmail.com
 * @Date 2018/8/10
 */
@RestController
public class HiController {
    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String testHello() {
        ServiceInstance instance = client.getLocalServiceInstance();
        String host = instance.getHost();
        int port = instance.getPort();
        URI uri = instance.getUri();
        String serviceId = instance.getServiceId();
        StringBuilder builder=new StringBuilder();
        builder.append("[host:").append(host).append("].[port:").append(port).append("].[uri:").append(uri).append("].[serviceId:"+serviceId).append("]");
        return builder.toString();
    }
}

在主类上添加@EnableEurekaClient注解以实现Eureka中的DiscoveryClient实现

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

@EnableEurekaClient
@SpringBootApplication
public class SpringcloudServiceApplication {

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

application.properties

#服务名称
spring.application.name=hi-service
#端口
server.port=2229
#注册到服务中心
eureka.client.serviceUrl.defaultZone=http://localhost:666/eureka/

启动:



异常:

Connected to the target VM, address: '127.0.0.1:63737', transport: 'socket'
14:56:45.020 [background-preinit] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Log4j2LoggerProvider
14:56:45.024 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 6.0.11.Final
14:56:45.032 [background-preinit] DEBUG org.hibernate.validator.internal.engine.resolver.TraversableResolvers - Cannot find javax.persistence.Persistence on classpath. Assuming non JPA 2 environment. All properties will per default be traversable.
14:56:45.036 [background-preinit] DEBUG org.hibernate.validator.internal.xml.config.ValidationXmlParser - Trying to load META-INF/validation.xml for XML based Validator configuration.
14:56:45.038 [background-preinit] DEBUG org.hibernate.validator.internal.xml.config.ResourceLoaderHelper - Trying to load META-INF/validation.xml via TCCL
14:56:45.038 [background-preinit] DEBUG org.hibernate.validator.internal.xml.config.ResourceLoaderHelper - Trying to load META-INF/validation.xml via Hibernate Validator's class loader
14:56:45.038 [background-preinit] DEBUG org.hibernate.validator.internal.xml.config.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only.
14:56:45.175 [background-preinit] DEBUG org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator - Loaded expression factory via original TCCL
14:56:45.181 [background-preinit] DEBUG org.hibernate.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator as ValidatorFactory-scoped message interpolator.
14:56:45.181 [background-preinit] DEBUG org.hibernate.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.resolver.TraverseAllTraversableResolver as ValidatorFactory-scoped traversable resolver.
14:56:45.181 [background-preinit] DEBUG org.hibernate.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.util.ExecutableParameterNameProvider as ValidatorFactory-scoped parameter name provider.
14:56:45.181 [background-preinit] DEBUG org.hibernate.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.DefaultClockProvider as ValidatorFactory-scoped clock provider.
14:56:45.181 [background-preinit] DEBUG org.hibernate.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory as ValidatorFactory-scoped script evaluator factory.
Disconnected from the target VM, address: '127.0.0.1:63737', transport: 'socket'

Process finished with exit code 1


修改:<version>2.0.4.RELEASE</version>为<version>1.4.0.RELEASE</version>



注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: