SpringCloud 学习(二) :服务注册与发现Eureka

Spring Cloud应用中可以支持多种的服务治理框架,比如Eureka、Consul、Zookeeper等,现在我们用的是consul,本文以SpringCloud Dalston.SR5版本介绍Eureka的使用:

  • 创建服务注册中心
  • 创建服务提供者
  • 创建服务消费者
  • 服务消费
  • 踩的坑

一、创建服务注册中心

1.创建一个基础SpringBoot工程,命名为eureka-server

2.修改pom.xml

(1)修改一:SpringCloud版本管理

<!-- 使用dependencyManagement进行版本管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

(2)修改二:添加Eureka Server 起步依赖

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

(3)完整pom.xml

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zrk</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Eureka Server</description>

    <!-- 使用dependencyManagement进行版本管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

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

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

</project>

3.修改主启动类

只需在主启动类上添加@EnableEurekaServer注解就可以启动一个服务注册中心:

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

官方文档截图

 4.修改配置

修改配置文件,如application.properties,也可用application.yml(官方文档使用)等:

spring.application.name=eureka-server
server.port=8761

eureka.instance.hostname=localhost
#不把自己注册到注册中心
eureka.client.register-with-eureka=false
#不去发现服务
eureka.client.fetch-registry=false
#服务注册中心url
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

启动工程,访问http://localhost:8761

可以看到Eureka管理页面,看到No instances available,表示还没有实例注册到注册中心。

注:后续就会发现SpringCloud整合其他框架时都是先导入对应起步依赖,再添加对应注解,再修改配置

更多详细配置可以参考EurekaInstanceConfigBean.java and EurekaClientConfigBean.java。

二、创建服务提供者

1.创建一个基础SpringBoot工程,命名为eureka-provider-user

2.修改pom.xml

(1)修改一:SpringCloud版本管理

    <!-- 使用dependencyManagement进行版本管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


(2)修改二:添加Eureka起步依赖

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

(3)完整pom.xml

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zrk</groupId>
    <artifactId>eureka-provider-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-provider-user</name>
    <description>Eureka Client</description>

    <!-- 使用dependencyManagement进行版本管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

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

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

</project>

3.修改主启动类

 只需在主启动类上添加@EnableEurekaClient注解,也可使用@EnableDiscoveryClient注解,两个注解都能激活Eureka中的DiscoveryClient实现,只是前者仅限于使用Eureka的情况下使用。

@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient
public class EurekaProviderUserApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderUserApplication.class, args);
    }
}

4.修改配置

spring.application.name=provider-user
server.port=8081
#设置服务注册中心的URL
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

启动该工程,访问http://localhost:8761

可以看到provider-user服务已经注册成功!

5.添加业务逻辑

(1)UserController.java

@RestController
@RequestMapping("user")
public class UserController
{
@RequestMapping(value = "getUserById/{id}")
public User getUser(@PathVariable Integer id){
User user = new User();
user.setId(id);
user.setName("张三");
user.setPassword("123");
return user;
}
}

(2)User.java

public class User {
    private Integer id;
    private String name;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

三、创建服务消费者

1.创建一个基础SpringBoot工程,命名为eureka-consumer-basketball

2.修改pom.xml

(1)修改同eureka-provider-user,只是多了web相关依赖:

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


(2)完整pom.xml

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zrk</groupId>
<artifactId>eureka-consumer-basketball</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-consumer-basketball</name>
<description>Eureka Client</description>

<properties>
<java.version>1.8</java.version>
</properties>

<!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

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

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

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

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

</project>

3.修改主启动类

 在主启动类上添加@EnableDiscoveryClient注解,并添加RestTemplate组件

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaConsumerBasketballApplication {

@Bean(name = "restTemplate")
RestTemplate restTemplate() {
return new RestTemplate();
}

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

}

4.修改配置

spring.application.name=consumer-basketball
server.port=8082
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

5.添加业务逻辑

(1)BasketballController.java

@RestController
public class BasketballController {

    @Resource
    private RestTemplate restTemplate;

    @RequestMapping(value = "getUser/{id}")
    public User getUserById(@PathVariable Integer id){
        return this.restTemplate.getForObject("http://provider-user/user/getUserById/" + id,User.class);
    }
}

(2)User.java

public class User {
    private Integer id;
    private String name;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

启动该工程,访问http://localhost:8761

可以看到consumer-basketball服务已经注册成功!

四、服务消费

浏览器访问http://localhost:8082/getUser/1

报了 java.net.UnknownHostException: provider-user异常,发现通过provider-user服务名直接访问不可以,查询后需要加@loadBalance注解才能用服务名访问,调整如下:

(1)修改一:添加ribbon依赖

<!-- ribbon ,实现客户端负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>

(2)修改二:加@loadBalance

重启工程,再次访问http://localhost:8082/getUser/1

访问成功!

五、踩的坑

1、网速慢下载maven很慢

  在网速慢的情况下下载maven依赖特别慢,可以通过修改setting.xml解决

  参考链接:https://www.cnblogs.com/zrk3/p/maven_speed_up.html

2、版本兼容问题

  SpringCloud跟SpringBoot存在版本兼容问题,导致启动报错java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder

     参考链接:https://www.cnblogs.com/zrk3/p/10405989.html

3、服务名访问问题

  消费者通过生产者服务的服务名进行访问时报 java.net.UnknownHostException异常。

     参考链接:https://blog.csdn.net/qq_18416057/article/details/79432504

原文地址:https://www.cnblogs.com/zrk3/p/springcloud_eureka.html