详解springcloud之服务注册与发现

 更新时间:2018年06月01日 10:59:13   作者:神牛步行3  
本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明,非常具有实用价值,需要的朋友可以参考下

本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明;现在北京这边很多创业公司都开始往springcloud靠了,可能是由于文档和组件比较丰富的原因吧,毕竟是一款目前来说比较完善的微服务架构;本次分享希望能给大家带来好的帮助;

  1. Eureka服务中心
  2. Provider注册服务
  3. Consumer发现服务
  4. Eureka服务中心高可用

Eureka服务中心

就我现在了解到并且用的比较多的注册中心有zookeeper和Eureka,我的上上篇文章分享了dubbo+zookeeper来构建服务,因此本次用的是Eureka,springcloud框架也是推荐它来作为注册中心,当然可以集成其他的服注册中心,毕竟springcloud依赖于springboot来构建项目的,因此集成其他组件是很快的;首先创建注册中心项目 eureka_server ,通过如下引入依赖:

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

然后在application.yml文件中增加配置项:

server:
 port: 2001
spring:
 application:
  name: eureka-server
eureka:
 client:
  register-with-eureka: false #禁止自己当做服务注册
  fetch-registry: false    #屏蔽注册信息
 instance:
  prefer-ip-address: true
  instance-id: ${spring.application.name}:${server.port}

配置完成后,还需要再启动类增加注解 @EnableEurekaServer ,设置基本完成即可运行,访问  http: // localhost:2001/ 得到如下界面:

Provider注册服务

有了服务注册中心,我们还需要提供一些服务并且把这些服务注册到服务中心去,这里为了方便先创建一个服务提供者和消费者共同使用的接口模块项目 eureka_api ,并创建如下接口和请求返回参数实体类:

public interface UserInterface {

  @PostMapping("/users")
  MoRp<List<MoUser>> getUsers(MoRq rq);

  @GetMapping("/msg")
  String getMsg();
}

MoUser实体:

public class MoUser {

  private long id;
  private String userName;
  private String userPwd;

  public long getId() {
    return id;
  }

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

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getUserPwd() {
    return userPwd;
  }

  public void setUserPwd(String userPwd) {
    this.userPwd = userPwd;
  }
}

然后创建我们的服务提供端的模块 eureka_provider ,同样引入eureka依赖不过和server端有点区别:

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

再来创建服务提供端要提供的服务UserController,并且实现我们eureka_api模块中的UserInterface接口,代码如下:

@RestController
public class UserController implements UserInterface {

  @Autowired
  private HttpServletRequest request;

  @Override
  public MoRp<List<MoUser>> getUsers(MoRq rq) {

    MoRp<List<MoUser>> rp = new MoRp<>();

    List<MoUser> list = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
      MoUser moUser = new MoUser();
      moUser.setId(i);
      moUser.setUserName("神牛" + i);
      list.add(moUser);
    }
    rp.setT(list);
    rp.setStatus(list.size() >= 1 ? 1 : 0);
    rp.setMessage(list.size() >= 1 ? "" : "暂无数据");
    return rp;
  }

  @Override
  public String getMsg() {

    return "这里是provider,端口:"+ request.getServerPort();
  }
}

这里需要注意的是Controller的两个服务接口中没有再加PostMapping或GetMapping,因为这个由被实现接口申明了;定义好了users和msg服务后,我们还需要能把他们注入到服务注册中心去,因此需要如下application.yml的配置:

spring:
 application:
  name: eureka-provider #服务名称
eureka:
 client:
  service-url:
   defaultZone: http://localhost:2001/eureka/ #服务中心地址
 instance:
  prefer-ip-address: true
  instance-id: ${spring.application.name}:${server.port}
server:
 port: 2004

我们还需要在启动类增加如下标记 @EnableEurekaClient ,它表示启动eureka客户端,因为服务提供者相对服务中心来说是属于客户端的存在;当运行eureka_provider项目的时候,我们在注册中心能看到如下信息:

为了保证服务提供端接口没问题,我们可以直接点击eureka-provider:2004,然后增加要方法接口的路径我这里是:http://192.168.153.148:2004/msg,即可得到如下正常访问接口返回的信息:

Consumer发现服务

有了接口服务,我们还需要消费服务,因此创建module项目eureka_consumer,因为这里采用fegin伪客户端的方式来访问我们服务提供端,并且同样需要引入eureka的依赖:

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

然后在service层定义UserService服务并且实现公共接口模块 eureka_api 中的接口,代码如:

@FeignClient(value = "eureka-provider")
 public interface UserService extends UserInterface {
 }

通过FeignClient来指定调用的服务端应用名称eureka-provider,这名称对应注册在服务中心的Application目录下 ,在Controller层创建一个响应的输出UserController并分别提供两个展示的接口,代码如:

@RestController
public class UserController{

  @Autowired
  private UserService userService;

  @GetMapping("/users")
  public MoRp<List<MoUser>> getUsers(MoRq rq) {
    return userService.getUsers(rq);
  }

  @GetMapping("/msg")
  public String getMsg() {
    return userService.getMsg();
  }
}

同样Consumer端也需要在application.yml中配置一些信息:

spring:
 application:
  name: eureka-consumer
eureka:
 client:
  service-url:
   defaultZone: http://localhost:2001/eureka/ #注册中心地址
 instance:
  prefer-ip-address: true
  instance-id: ${spring.application.name}:${server.port}
server:
 port: 2005

配置基本和provider端差不多,最后需要在启动类申明如下注解:

@SpringBootApplication
@EnableDiscoveryClient //消费者客户端
@EnableFeignClients //feign客户端
public class EurekaConsumerApplication {
  public static void main(String[] args) {
    SpringApplication.run(EurekaConsumerApplication.class, args);
  }
}

启动eureka_consumer项目后,我们能在注册中心看到它注册进来的信息:

然后通过访问eureka_consumer消费方的接口测试eureka_provider服务提供方的接口数据知否能正常响应,接口地址 http: // 192.168.153.148:2005/msg :

通过访问consumer得到了provider的结果,这就是服务注册和发现的基本测试流程;至于消费方怎么请求到提供方接口的,我们通过如下手工图可解:

Eureka服务中心高可用

由上面手工图来看,服务中心承担着很重要的角色,通常这种服务中心不仅仅只搭建一个,因此需要搭建一套高可用的服务中心出来;其实很简单provider和consumer配置都不用动,我们只需要在第一节点的eureka-server项目的application.yml中配置下并且在多启动几个不同端口的服务就行了(同一台服务器是多个端口,不同服务器端口可能是一样的):

server:
 port: 2001
spring:
 application:
  name: eureka-server
eureka:
 client:
  register-with-eureka: true  #配置高可用的时候需要开放自己注册自己
  fetch-registry: true
  service-url:
   defaultZone: http://localhost:2002/eureka/ #注册到端口2002的eureka中
#   defaultZone: http://localhost:2001/eureka/
 instance:
  prefer-ip-address: true
  instance-id: ${spring.application.name}:${server.port}
 server:
  eviction-interval-timer-in-ms: 2000 #剔除失效服务间隔

高可用配置需要注意以下几点:

  1. register-with-eureka: true 配置高可用的时候需要开放自己注册自己,便于多个eureka注册中心互通
  2. defaultZone:http://localhost:2002/eureka/ 每个注册中心都需要吧自己注册到别的注册中心去

这里我创建了两个注册中心地址分别为:http://localhost:2001/,http://localhost:2002/;由于之前provider和consumer配置的注册中心地址都是2001端口的,为了验证高可用我们需要访问2002端口注册中心,效果如:

能够看到2002端口有着2001端口同样的注册信息,当我关闭2001端口的应用时,2002还是能够查到provider和consumer的信息,更详细的配置可以参照官网说明。

git地址: https://github.com/shenniubuxing3

nuget 发布包:https://www.nuget.org/profiles/shenniubuxing3

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVA进阶之HashMap底层实现解析

    JAVA进阶之HashMap底层实现解析

    Hashmap是java面试中经常遇到的面试题,大部分都会问其底层原理与实现,为了能够温故而知新,特地写了这篇文章,以便时时学习
    2021-11-11
  • 使用@EnableWebMvc轻松配置Spring MVC

    使用@EnableWebMvc轻松配置Spring MVC

    这篇文章主要为大家介绍了使用@EnableWebMvc轻松配置Spring MVC实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • JavaEE简介_动力节点Java学院整理

    JavaEE简介_动力节点Java学院整理

    这篇文章主要介绍了JavaEE简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java反射(Class类,Class对象获取)

    Java反射(Class类,Class对象获取)

    下面是对Java反射机制是在程序的运行过程中,Java语言的反射机制的超详细解说,点进来的小伙伴不要错过奥
    2021-08-08
  • SpringMVC请求参数的使用总结

    SpringMVC请求参数的使用总结

    在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,本文主要接介绍了SpringMVC请求参数的使用总结,感兴趣的可以了解一下
    2021-06-06
  • Java8加java10等于Java18的版本查看及特性详解

    Java8加java10等于Java18的版本查看及特性详解

    这篇文章主要为大家介绍了Java 8加java10等于Java18的各个版本要点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • JVM完全解读之GC日志记录分析

    JVM完全解读之GC日志记录分析

    这篇文章主要介绍了JVM完全解读之GC日志记录分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-01-01
  • Java中volatile 的作用

    Java中volatile 的作用

    这篇文章主要介绍了Java中volatile 的作用,volatile是Java并发编程的重要组成部分,主要作用是保证内存的可见性和禁止指令重排序,下文更多对volatile作用的介绍,需要的小伙伴可以参考一下
    2022-05-05
  • Struts2学习手册之文件上传基础教程

    Struts2学习手册之文件上传基础教程

    Struts2提供的文件上传下载机制十分简便,使得我们写很少的代码,下面这篇文章主要给大家介绍了关于Struts2学习手册之文件上传的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • SWT(JFace)体验之ProgressBar

    SWT(JFace)体验之ProgressBar

    SWT(JFace)体验之ProgressBar 实现代码。
    2009-06-06

最新评论