SpringCloud技术指南系列(二)服务注册发现之Eureka服务注册

it2022-05-07  0

SpringCloud技术指南系列(二)服务注册发现之Eureka服务注册

SpringCloud所谓的服务注册与发现,流程大致是:

将Springboot微服务客户端项目的地址等信息,通过网络发送到注册中心,由注册中心保存下来。

另一个客户端B访问已经注册到注册中心的服务A,通过注册中心提供的域名解析方式,解析出服务A的地址等信息。

如果提供服务A的客户端有多个,就按照某个策略(比如轮询、负载均衡等)选取一个地址返回。

客户端B访问注册中心返回的地址,获取结果,这里注意,是B直接访问A,而不是注册中心转发,因此要保证B和A是互通的。

目前服务发现的解决方案有Eureka,Consul,Zookeeper等,这三个是SpringCloud官方支持的。

上一篇已经讲了如何搭建Eureka的注册中心,本篇讲下Eureka的服务注册,就是将当前服务注册到Eureka的注册中心。

代码可以在SpringBoot组件化构建https://www.pomit.cn/java/spring/springcloud.html中的EurekaServer组件中查看,并下载。

首发地址:

  品茗IT-同步发布

品茗IT提供在线支持:

  一键快速构建Spring项目工具

  一键快速构建SpringBoot项目工具

  一键快速构建SpringCloud项目工具

  一站式Springboot项目生成

  Mysql一键生成Mybatis注解Mapper

  Mysql一键生成SpringDataRest项目

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

一、引入依赖

需要引入spring-boot-starter-web和spring-cloud-starter-netflix-eureka-client。

依赖如下:

<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>cn.pomit</groupId> <artifactId>springcloudwork</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>EurekaServer</artifactId> <name>EurekaServer</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <maven-jar-plugin.version>2.6</maven-jar-plugin.version> </properties> <dependencies> <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>

父模块pom文件可以在https://www.pomit.cn/spring/SpringCloudWork/pom.xml获取。

二、配置eureka服务注册

这里使用yaml文件写配置,application.yml:

server: port: 8858 spring: profiles: active: loc application: name: eurekaServer eureka: instance: hostname: localhost prefer-ip-address: true client: serviceUrl: defaultZone: http://${eureka.instance.hostname}:8888/eureka/

这里面,包含了端口、应用名、注册信息、方式。

spring.application.name是标识了应用名,注册到eureka之后,显示的就是它。

eureka.instance.prefer-ip-address是使用ip地址,如果不写它,默认是域名,那样测试起来很麻烦。

eureka.client.serviceUrl这个,是配置将本服务注册为客户端,这里注册到http://localhost:8888/eureka/。

注意这里的url里有/eureka,这个后缀,而访问注册中心的时候用的是http://localhost:8888。

三、启动服务注册

3.1 启动类

使用@EnableEurekaClient和@EnableDiscoveryClient注解启动类, @EnableEurekaClient是将项目作为客户端注册到注册中心的注解,@EnableDiscoveryClient开启服务发现功能。使用Eureka做服务发现,要加上这两个注解。

EurekaTestServerApplication:

package cn.pomit.springbootwork.eurekaserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @EnableDiscoveryClient @SpringBootApplication public class EurekaTestServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaTestServerApplication.class, args); } }

3.2 测试下应用

下面提供了个web接口做测试,访问http://127.0.0.1:8858/eurekaServer/ip ,获取当前请求ip和服务器ip地址。

EurekaTestServerRest :

package cn.pomit.springbootwork.eurekaserver.web; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import cn.pomit.springbootwork.eurekaserver.model.IpModel; import cn.pomit.springbootwork.eurekaserver.model.ResultModel; import cn.pomit.springbootwork.eurekaserver.util.IPUtil; @RestController @RequestMapping("/eurekaServer") public class EurekaTestServerRest { @RequestMapping(value = "/ip", method = { RequestMethod.GET }) public ResultModel welCome(HttpServletRequest request) { IpModel ipModel = new IpModel(); ipModel.setClientIpAddress(IPUtil.getIpAddr(request)); ipModel.setServerIpAddress(IPUtil.localIp()); return ResultModel.ok(ipModel); } }

四、过程中用到的工具类和实体

过程中用到了ResultModel实体和ResultCode枚举类,如果作为测试来用,其实没必要,这里是为后续章节做铺垫,将实体统一化,所以才多出了ResultModel实体和ResultCode枚举类。

IPUtil:

package cn.pomit.springbootwork.eurekaserver.util; import java.net.InetAddress; import java.net.UnknownHostException; import javax.servlet.http.HttpServletRequest; public class IPUtil { /** * @Description: 获取客户端IP地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if (ip.equals("127.0.0.1")) { // 根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (Exception e) { e.printStackTrace(); } ip = inet.getHostAddress(); } } // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if (ip != null && ip.length() > 15) { if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } return ip; } /** * 获取的是本地的IP地址 * * @return */ public static String localIp() { String result = ""; try { InetAddress address = InetAddress.getLocalHost(); result = address.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } return result; } }

IpModel :

package cn.pomit.springbootwork.eurekaserver.model; public class IpModel { private String clientIpAddress; private String serverIpAddress; public String getClientIpAddress() { return clientIpAddress; } public void setClientIpAddress(String clientIpAddress) { this.clientIpAddress = clientIpAddress; } public String getServerIpAddress() { return serverIpAddress; } public void setServerIpAddress(String serverIpAddress) { this.serverIpAddress = serverIpAddress; } }

ResultModel:

ResultCode:

详细完整的实体,可以访问品茗IT-博客《SpringCloud技术指南系列(二)服务注册发现之Eureka服务注册》进行查看

快速构建项目

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot使用吧!


最新回复(0)