前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring cloud eureka服务发现注册(二)

spring cloud eureka服务发现注册(二)

作者头像
海涛
发布2019-09-12 11:24:10
3660
发布2019-09-12 11:24:10
举报
文章被收录于专栏:海涛技术日常海涛技术日常

环境说明:spring boot2.0 + jdk1.8

第一步:搭建eureka server,创建一个maven项目,也可以直接idea或者 https://start.spring.io/ 快速创建 pom.xml文件

代码语言:javascript
复制
<?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>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hht</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.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>

    <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>

启动类

代码语言:javascript
复制
package com.hht.eurekaserver;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

配置文件

代码语言:javascript
复制
spring.application.name=spring-cloud-eureka-server
server.port=12345

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=\
  http://localhost:${server.port}/eureka

注意单节点情况:

eureka.client.register-with-eureka=false

eureka.client.fetch-registry=false

启动成功后 访问 http://localhost:12345/

第二步,搭建eureka client端部分,包括服务注册、发现和使用,整体结构如下图

user-api模块用来定义接口

代码语言:javascript
复制
package com.hht.user.domain;

/**
 * @author hht
 * @ClassName User
 * @Description TODO
 * @Date 2019/4/30 15:50
 * @VERSION 1.0
 */
public class User {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
代码语言:javascript
复制
package com.hht.user.service;

import com.hht.user.domain.User;
import org.springframework.stereotype.Service;

import java.util.Collection;

public interface UserService {
    /**
     * 保存用户
     *
     * @param user
     * @return 如果保存成功的话,返回<code>true</code>,
     * 否则返回<code>false</code>
     */
    boolean save(User user);

    /**
     * 查询所有的用户对象
     *
     * @return 不会返回<code>null</code>
     */
    Collection<User> findAll();
}

user-service-consumer模块用来模拟服务发现和使用

pom.xml

代码语言:javascript
复制
<?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">
    <parent>
        <artifactId>eureka-client</artifactId>
        <groupId>com.hht</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service-consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.hht</groupId>
            <artifactId>user-api</artifactId>
            <version>${project.version}</version>
        </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-client</artifactId>
        </dependency>
    </dependencies>

</project>
代码语言:javascript
复制
# 应用名称
spring.application.name=user-service-client
server.port=8080

# Eureka 服务器地址
eureka.client.serviceUrl.defaultZone= http://localhost:12345/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=192.168.1.160
代码语言:javascript
复制
@SpringBootApplication
@EnableDiscoveryClient
public class UserConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerApplication.class,args);
    }
}

实现接口类,通过restTemplate(实验,一般生产环境有替代方案)

代码语言:javascript
复制
package com.hht.service;

import com.hht.user.domain.User;
import com.hht.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Collection;

/**
 * @author hht
 * @ClassName com.hht.service.UserServiceProxy
 * @Description TODO
 * @Date 2019/4/30 16:16
 * @VERSION 1.0
 */
@Service
public class UserServiceProxy implements UserService {
    private static final String PROVIDER_SERVER_URL_PREFIX = "http://user-service-provider";

    /**
     * 通过 REST API 代理到服务器提供者
     */
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public boolean save(User user) {
        User returnValue =
                restTemplate.postForObject(PROVIDER_SERVER_URL_PREFIX + "/user/save", user, User.class);
        return returnValue != null;
    }

    @Override
    public Collection<User> findAll() {
        return restTemplate.getForObject(PROVIDER_SERVER_URL_PREFIX + "/user/list", Collection.class);
    }
}

user-service-provider模块用来模拟服务提供方

pom.xml

代码语言:javascript
复制
<?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">
    <parent>
        <artifactId>eureka-client</artifactId>
        <groupId>com.hht</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.hht</groupId>
            <artifactId>user-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.9.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.9.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
</project>
代码语言:javascript
复制
# 应用名称
spring.application.name=user-service-provider
# Eureka Client 端口
server.port=8081
# Eureka 服务器地址
eureka.client.serviceUrl.defaultZone= http://localhost:12345/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=192.168.1.160

接口实现类,业务的真实逻辑

代码语言:javascript
复制
package com.hht.service;

import com.hht.respository.UserRespository;
import com.hht.user.domain.User;
import com.hht.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collection;


@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private UserRespository respository;

    @Override
    public boolean save(User user) {
        return respository.save(user);
    }

    @Override
    public Collection<User> findAll() {
        return respository.findAll();
    }
}

到此结束:整体逻辑为,两个client 都注册到了 server端,通过访问服务名字+方法调用另一个服务 附加:一般生产环境需要高可用 只要修改eureka server的配置文件,启动多个即可

代码语言:javascript
复制
eureka.client.register-with-eureka=false  #去掉
eureka.client.fetch-registry=false        #去掉
eureka.client.service-url.defaultZone=\   #填写除自己外的,其它server节点地址
  http://localhost:${server.port}/eureka

测试代码地址:https://gitee.com/huhaitao/spring_cloud_test/tree/master/eureka

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档