1、前言java
本文为spring cloud 微服务框架专题的第二篇,主要讲解如何快速搭建微服务以及如何注册。 本文理论很少,主要是傻瓜式的环境搭建,适合新手快速入门。node
为了更好的懂得原理,你们能够下载《spring cloud 和docker微服务架构实战》pdf得书籍 连接: https://pan.baidu.com/s/1LLSqy0QGOhFei-5XJ2HVSA 密码: d2x7git
若是这个连接失效了,你们能够联系个人邮箱,我会很快回复并把pdf发送给您, 邮箱地址 xinyudai_ifox@163.comgithub
本教程代码地址为 https://github.com/daixiaoyu/springcloud-example-feign,你们能够下载下来运行web
代码说明:为了力求真实开发实战,没有将注册中心,微服务,网关三个项目合在一个module中,而是拆分了,因此引入到idea中时请开三个idea分别引入spring
2、准备环境docker
maven(将maven配置到环境变量中,便于后期打包)、 若是须要源码请安装git、jdk 、*须要运行第一篇专题的注册中心*api
因为此微服务的暴露是基于Feign的思想的,若是你们没有这方面的知识能够先查看pdf中关于feign的讲解,或者阅读其余博客,我后面的专题会专门讲解Feign服务器
3、搭建和注册微服务架构
能够看到provider中有两个模块,分别为cloud-provider 和cloud-provider-api,从命名上大概就能够清晰的看到,api模块只是
微服务须要向调用方提供的api接口,实际开发中,咱们会将此模块打包到私服,而调用方能够经过Feign像调用本地方法同样
调用provier的真正实现,入参和返回值全实现了序列化接口并在api中定义
你们能够看到,规范的写法是,一个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服务
<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; } }
咱们就能够看见咱们的服务已经注册到了注册中心,服务名,惟一服务id都已经指定,实际上在注册中心还保存了当前服务的ip地址端口号等信息。
下一篇我将编写远程的服务调用方,若是经过服务提供的api包就能够像调本地方法同样调用远程的服务,文章写得比较粗糙,我会不断优化和改进
谢谢你们,若是有哪里不明白的,或者运行不了个人源码项目的,能够给我发送邮件 xinyudai_ifox@163.com