• spring cloud 专题二(spring cloud 入门搭建 之 微服务搭建和注册)


    一、前言

          本文为spring cloud 微服务框架专题的第二篇,主要讲解如何快速搭建微服务以及如何注册。 本文理论不多,主要是傻瓜式的环境搭建,适合新手快速入门。

           为了更好的懂得原理,大家可以下载《spring cloud 和docker微服务架构实战》pdf得书籍      链接: https://pan.baidu.com/s/1LLSqy0QGOhFei-5XJ2HVSA  密码: d2x7

           如果这个链接失效了,大家可以联系我的邮箱,我会很快回复并把pdf发送给您, 邮箱地址 xinyudai_ifox@163.com

          本教程代码地址为  https://github.com/daixiaoyu/springcloud-example-feign,大家可以下载下来运行

          代码说明:为了力求真实开发实战,没有将注册中心,微服务,网关三个项目合在一个module中,而是拆分了,所以引入到idea中时请开三个idea分别引入

    二、准备环境

           maven(将maven配置到环境变量中,便于后期打包)、 如果需要源码请安装git、jdk  、*需要运行第一篇专题的注册中心*

           由于此微服务的暴露是基于Feign的思想的,如果大家没有这方面的知识可以先查看pdf中关于feign的讲解,或者阅读其他博客,我后面的专题会专门讲解Feign

    三、搭建和注册微服务

    •  将源码中的provider模块导入到Idea中,如果没有源码则可可以按照接下来的思路自己搭建,目录结构为下

               

               可以看到provider中有两个模块,分别为cloud-provider 和cloud-provider-api,从命名上大概就可以清晰的看到,api模块只是

               微服务需要向调用方提供的api接口,实际开发中,我们会将此模块打包到私服,而调用方可以通过Feign像调用本地方法一样

               调用provier的真正实现,入参和返回值全实现了序列化接口并在api中定义

    •  编写api模块,api模块没有任何的技术栈,是单纯的java Bean和接口规范,是为了给客户端约束调用参数和返回值的,我们来

               

               大家可以看到,规范的写法是,一个Rao接口,一个param入参和一个response返回值。接下来我们来看看Rao接口的定义

    package com.dai.cloud.Rao;
    
    import com.dai.cloud.param.UserParam;
    import com.dai.cloud.response.UserResponse;
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    /**
     * @author <a href="mailto:daixinyu@sinoland666.com">代欣雨</a>
     * @description 服务提供者接口
     * @date 2018/1/19 15:54
     * @Version V1.0
     */
    @FeignClient("provider-server")  //告诉客户端,这个接口需要到这个服务中去寻找
    @RequestMapping(value = "/provider") 
    public interface ProviderRao {
        @RequestMapping(value = "/user",method = RequestMethod.POST)
            UserResponse getUserByParam(@RequestBody UserParam param);
    }
    

      大家可以看到,这里和spring mvc 的实现没有什么大的区别,对的,其实就是对外暴露接口而已,提供http服务

    •    接下来我们来看看provider模块(api的具体实现),是一个提供了http接口的服务,我们先看看他的pom

                 

       <dependencyManagement>    spring cloud 的依赖
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Camden.SR3</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <dependency>   <spring mvc的依赖>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>   <注册中心的依赖,因为此微服务需要注册到注册中心>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>   <需要实现的api的接口,api>
                <groupId>com.dai.cloud</groupId>
                <artifactId>cloud-provicer-api</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
        </dependencies>
    
    •   再来看看他的配置文件

             

    spring:
      application:
        name: provider-server    这里必须同api中rao接口中的@FeignClient的value值一样,不然调用方无法从注册中心获取到此服务地址
    server:
        port: 8006   服务端口
    eureka:
        client:
          service-url:
            defaultZone: http://localhost:9527/eureka/    注册中心地址,此微服务运行起来后会自动注册到地址
        instance:
            prefer-ip-address: true           /将ip配置到注册中心,实际的调用依然是ip ,http
            hostname: com.dai.provider.node1.com   /当前节点的名称
            instance-id: com.dai.provider.node1.com  /当前节点的id   实际开发中,一个微服务会运行多个实例,用于高可用,这两个配置都是用于区分每个实例
    feign:       /这个是Feign的配置,大家可以暂时不了解,或者看pdf的书籍
       hystrix:
          enabled:true

    接下来我们来看看Rao接口的实现

    package com.dai.cloud.controller;
    
    import com.dai.cloud.Rao.ProviderRao;
    import com.dai.cloud.param.UserParam;
    import com.dai.cloud.response.UserResponse;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author <a href="mailto:daixinyu@sinoland666.com">代欣雨</a>
     * @description 请填类描述
     * @date 2018/1/19 15:51
     * @Version V1.0
     */
    @RestController  // spring mvc的注解,将此接口注册,必须是RestController
    @Api(tags = "服务提供中心",description ="服务提供中心" )
    public class ProviderController  implements ProviderRao {  // 可以看到这里实现了刚才在api中定义的接口,所有的连接地址都继承了,唯一需要注意的是入参的注解要写进来(@RequestBody等)
        @ApiOperation(value = "查询用户")
        @Override
        public UserResponse getUserByParam(@RequestBody UserParam param) {
            UserResponse response = new UserResponse();
            response.setUserId(param.getUserId());
            response.setUserName("代欣雨");
            return response;
        }
    }
    • 服务都已经搭建完成了,其实很简单,就是往常的服务器和接口实现,1、只是注册到了注册中心,让其他调用者不用显示的指定ip和端口(注册中心会维护和管理)2、对外提供了api的接口,这里其实和web service的思想差不多
    • 接下来我们运行 Spring boot 的启动类(常规的,前提是注册中心已经运行)

               

              我们就可以看见我们的服务已经注册到了注册中心,服务名,唯一服务id都已经指定,实际上在注册中心还保存了当前服务的ip地址端口号等信息。

              下一篇我将编写远程的服务调用方,如果通过服务提供的api包就可以像调本地方法一样调用远程的服务,文章写得比较粗糙,我会不断优化和改进

              谢谢大家,如果有哪里不明白的,或者运行不了我的源码项目的,可以给我发送邮件 xinyudai_ifox@163.com

      

        

  • 相关阅读:
    Nginx作为缓存服务
    Nginx作为代理服务
    ZipUtils zip压缩实现
    getman九桃小说解析油猴脚本
    maven添加代理加速jar包下载
    ffmpeg MP3 flv 视频转mp3
    ActiveMQ配置用户认证信息
    JS实现HTML标签转义及反转义
    删除registry镜像数据,以centos为例
    启动一个带登录账号密码的registry容器
  • 原文地址:https://www.cnblogs.com/daixinyu/p/8643342.html
Copyright © 2020-2023  润新知