当前位置: 移动技术网 > IT编程>开发语言>Java > SpringCloud学习笔记(1):Eureka注册中心

SpringCloud学习笔记(1):Eureka注册中心

2019年09月11日  | 移动技术网IT编程  | 我要评论

我本神探 紧急营救,钨钢圆棒,巴格达电池

简介

eureka是netflix开源的基于rest的服务治理方案,分为server端和client端,server端为注册中心,其他微服务通过client端连接server端进行服务的注册和发现。

项目介绍

  1. sc-parent,父模块
  2. sc-provider,提供者模块
  3. sc-eureka,注册中心
  4. sc-consumer-discovery,消费者模块

搭建父模块

创建父模块sc-parent,pom.xml:

<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.cf</groupid>
  <artifactid>sc-parent</artifactid>
  <version>0.0.1-snapshot</version>
  <packaging>pom</packaging>
   
   <!-- 继承spring boot的默认值 -->
   <parent>
       <groupid>org.springframework.boot</groupid>
       <artifactid>spring-boot-starter-parent</artifactid>
       <version>2.1.6.release</version>
       <relativepath /> <!-- lookup parent from repository -->
   </parent>
   
   <properties>
    <!-- 降低maven-jar-plugin插件版本,防止版本不匹配导致的pom.xml第一行报错 -->
    <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
   </properties>
   
   <dependencies>
        <!-- 添加web应用依赖 -->
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>
   </dependencies>
   
   <dependencymanagement>
        <dependencies>
            <!-- springcloud依赖 -->
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>greenwich.sr2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
   </dependencymanagement>
   
   <build>
        <plugins>
               <!-- 打可执行jar包插件 -->
               <plugin>
                   <groupid>org.springframework.boot</groupid>
                   <artifactid>spring-boot-maven-plugin</artifactid>
               </plugin>
               
               <!-- 指定编译插件使用的jdk版本 -->
               <plugin>
                    <groupid>org.apache.maven.plugins</groupid>
                    <artifactid>maven-compiler-plugin</artifactid>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
        </plugins>
   </build>
</project>

搭建注册中心

1.在父模块下创建子模块项目sc-eureka,pom.xml:

<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>
  <parent>
    <groupid>com.cf</groupid>
    <artifactid>sc-parent</artifactid>
    <version>0.0.1-snapshot</version>
  </parent>
  <artifactid>sc-eureka</artifactid>
  
  <dependencies>
    <!-- eureka服务端依赖 -->
    <dependency>
        <groupid>org.springframework.cloud</groupid>
        <artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
    </dependency>
  </dependencies>
</project>

2.创建启动类eureka.eurekaapplication:

package eureka;

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.netflix.eureka.server.enableeurekaserver;

//声明该类为springboot服务的入口
@springbootapplication
//声明该微服务为注册中心,提供服务发现和注册的功能
@enableeurekaserver
public class eurekaapplication {
    public static void main(string[] args) {
        springapplication.run(eurekaapplication.class, args);
    }
}

3.创建配置文件/src/main/resources/application.yml:

server:
  port: 8080 #当前服务端口

eureka:
  instance:
    hostname: localhost #当前eureka实例主机名
  client:
    registerwitheureka: false #表示不向注册中心注册自己
    fetchregistry: false #表示此客户端不需要从eureka注册中心获取eureka注册表信息
    serviceurl:
      defaultzone: http://localhost:8080/eureka/ ##eureka对外提供的地址(客户端连接的地址)

其他配置信息可以参考eurekainstanceconfigbean和eurekaclientconfigbean两个配置类

4.运行启动类eurekaapplication,在浏览器中访问http://www.lhsxpumps.com/_localhost:8080/,出现如下图表示注册中心搭建成功:

提供者与服务注册

1.在父模块下创建子模块项目sc-provider,pom.xml:

<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>
  <parent>
    <groupid>com.cf</groupid>
    <artifactid>sc-parent</artifactid>
    <version>0.0.1-snapshot</version>
  </parent>
  <artifactid>sc-provider</artifactid>
  
  <dependencies>
    <!-- eureka客户端依赖,用于连接服务端进行服务注册和发现 -->
    <dependency>
        <groupid>org.springframework.cloud</groupid>
        <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
    </dependency>
  </dependencies>
</project>

2.创建启动类provider.providerapplication:

package provider;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;

@springbootapplication
public class providerapplication {

    public static void main(string[] args) {
        springapplication.run(providerapplication.class, args);
    }
}

3.创建controller:provider.controller.bookcontroller

package provider.controller;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

@requestmapping("/book")
@restcontroller
public class bookcontroller {
    
    @getmapping("/list")
    public string getbooklist(){
        //模拟从service返回数据
        return "[\"java入门到放弃\",\"c++入门到放弃\",\"python入门到放弃\",\"c入门到放弃\"]";
    }
}

4.创建配置文件/src/main/resources/application.yml:

server:
  port: 8081

spring:
  application:
    name: sc-provider #注册到eureka注册中心上的服务名称,对应eureka界面上的application列
    
eureka:
  client:
    serviceurl:
      defaultzone: http://localhost:8080/eureka/ #注册中心的访问地址
  instance:
    preferipaddress: true #表示将自己的ip注册到eureka注册中心。默认为false,表示将hostname注册到注册中心

5.依次启动注册中心sc-eureka和提供者sc-provider,当提供者启动时,会将自己的信息注册到eureka注册中心,在浏览器中访问http://www.lhsxpumps.com/_localhost:8080/,提供者sc-provider已经在注册中心注册。

消费者和服务发现

1.在父模块下创建子模块项目sc-consumer-discovery,pom.xml:

<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>
  <parent>
    <groupid>com.cf</groupid>
    <artifactid>sc-parent</artifactid>
    <version>0.0.1-snapshot</version>
  </parent>
  <artifactid>sc-consumer-discovery</artifactid>
  
  <dependencies>
    <dependency>
        <groupid>org.springframework.cloud</groupid>
        <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
    </dependency>
  </dependencies>
</project>

2.创建启动类consumer.consumerdiscoveryapplication:

package consumer;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.context.annotation.bean;
import org.springframework.web.client.resttemplate;

@springbootapplication
public class consumerdiscoveryapplication {
    public static void main(string[] args) {
        springapplication.run(consumerdiscoveryapplication.class, args);
    }
    
    @bean
    public resttemplate resttemplate(){
        return new resttemplate();
    }
}

3.创建调用提供者服务的controller:consumer.controller.consumerdiscoverycontroller

package consumer.controller;
import java.util.list;
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.getmapping;
import org.springframework.web.bind.annotation.restcontroller;
import org.springframework.web.client.resttemplate;

@restcontroller
public class consumerdiscoverycontroller {
    @autowired
    private discoveryclient discoveryclient;
    
    @autowired
    private resttemplate resttemplate;
    
    @getmapping("/getbooklist")
    public string getbooklist(){
        //通过服务名获取实例信息
        list<serviceinstance> list = discoveryclient.getinstances("sc-provider");
        if (list != null && list.size() > 0 ) {
            //调用服务,并返回服务结果
            return resttemplate.getforobject(list.get(0).geturi() + "/book/list", string.class);
        }
        return null;
    }
}

4.创建application.yml:

server:
  port: 8082

spring:
  application:
    name: sc-consumer-discovery
    
eureka:
  client:
    registerwitheureka: false #在本实例中消费者不提供服务,所以无需到注册中心注册。在实际应用中,消费者也可能是提供者。
    serviceurl:
      defaultzone: http://localhost:8080/eureka/

5.依次启动注册中心sc-eureka、提供者sc-provider、消费者sc-consumer-discovery,当消费者启动时,会从注册中心查询可用的服务列表及其网络地址。直接访问提供者和消费者调用提供者结果如下:

总结

在传统的应用程序中,都是把提供者的网络地址硬编码在代码中,导致提供者和消费者耦合度高,当提供者网络地址发生了变化,则需要修改消费者配置并重新发布。eureka起到了解耦的作用,提供者到eureka注册中心中注册,消费者从eureka注册中心中获取提供者的网络地址并进行调用,当提供者网络地址变更时会重新到注册中心注册。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网