文档章节

Spring Cloud构建微服务

稻草鸟人
 稻草鸟人
发布于 2016/05/25 11:41
字数 1303
阅读 8402
收藏 62

 

这个文章的目的不在于展示一个完整的项目,主要是为了提供一种思路,一种利用spring boot以及spring cloud相关技术构建微服务系统 所以有些细节部分不会太详实,还请见谅

首先了解下项目结构

请忽略config-service,这里先不说这个

pom.xml配置

<!--这里只写出比较重要的配置,模组依赖的配置这里就不写了,不明白的可以先看看maven相关知识-->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</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>Brixton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

discovery-service

discovery-service目录结构如下,主要就是一个Java类,外加两个yml配置文件

DiscoveryApplication.java 内容如下 注解SpringBootApplication是@Configuration @EnableAutoConfiguration @ComponentScan三个注解的集合 注解EnableEurekaServer表明这是一个Eureka Server,用于服务的注册

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {

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

bootstrap.yml配置如下,这里只配置了服务的名字叫 discovery

spring:
    application:
        name: discovery  
 
application.yml配置如下
server.port配置了tomcat的启动端口,eureka实例的名字,以及eureka其他配置。因为我们这里是eureka服务端,
register-with-eureka配置为false,这个配置表示是否将其本身注册到eureka server以被其他发现
fetch-registry配置为false,这个配置表示是否需要从eureka server中抓取eureka上的注册信息
defaultZone 默认地址为 http://localhost:8761/eureak
 
server:
    port: 8761

eureka:
    instance:
        hostname: discovery
    client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
            defaultZone: http://discovery:${server.port}/eureka/

spring.cloud.config.discovery.enabled: true

category-service

category-service 目录结构大致如下,这里我们主要说明下CategoryController.java、CategoryApplication.java、
application.yml、bootstrap.yml的内容。

CategoryController.java内容如下,主要就是对外提供服务,通过访问地址 /v1/category
 
@RestController
@RequestMapping("/v1")
public class CategoryController {

    private static final Logger LOGGER = LoggerFactory.getLogger(CategoryController.class);


    @Autowired
    CategoryService categoryService;

    @RequestMapping("/category")
    public List<Category> getCategory() {
        LOGGER.info("哇塞~鸟人哎哎哎哎");

        return categoryService.getCategory();
    }
}
 
CategoryApplication.java主要内容如下,最重要的就是@EnableEurekaClient表示这是个eureka client,这个应用
将会被注册到eureka server,这个应用的端口是什么?注册到哪个eureka server?带着这些疑问,待会我们看application.yml
 
@SpringBootApplication
@EnableEurekaClient
public class CategoryApplication {

    public static void main(String[] args) {
        SpringApplication.run(CategoryApplication.class,args);
 }
}
 
application.yml如下,server.port配置的端口为0表明启动这个项目之后,会自动为其分配一个可用端口,如果我们把这个应用
打成一个可执行jar包,在不重新指定端口的情况下,只会有一个程序能正常工作哦。
defaultZone 指明了该服务注册的地址,服务将会被注册到这个地址上
ribbon.eureka.enabled 默认情况即为true,这里不配置也无所谓
 
server:
    port: 0

eureka:
    client:
    serviceUrl:
      defaultZone: http://discovery:8761/eureka/
instance:
    preferIpAddress: true

ribbon:
    eureka:
    enabled: true
 
bootstrap.yml配置如下,这里配置了服务的名字叫catelog-service,其他啥都没有哦
 
spring:
    application:
        name: catalog-service

gateway-service

gateway-service项目结构如下,gateway主要是为了统一暴露接口而生,服务众多的情况下,对前端来讲,我不需要记住那么多的域名
地址来调用API,我需要记住的只是gateway的地址就行。

Application.java内容如下,最主要的其实就是@EnableSidecar,这个东西他提供了一个jsp页面。通过这个页面我们可以知道
gateway以及其他在eureka server上注册的服务的健康状况,并且这个注解包含了@EnableZuulProxy,所以呢,它也支持软
负载均衡,如果启动多个服务,通过gateway来调用这个接口,多次调用我们会发现,请求会落在不同的服务上    
 
@SpringBootApplication
@EnableSidecar
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
 
application.yml如下,里面主要多了一个endpoints配置和sidecar的端口配置,endpoints是为了监控系统才有的配置,
具体可以参看AbstractEndpoint.java的实现类。sidecar的端口这里配置的是80,其他端口也是可以的
bootstrap.yml就不提了,因为里面只有服务的名字,和上面的类似
 
server:
    port: 10000

endpoints:
    restart:
        enabled: true
    shutdown:
        enabled: true
    health:
        sensitive: false

eureka:
    instance:
        hostname: gateway
    client:
        registerWithEureka: true
        fetchRegistry: true
        serviceUrl:
            defaultZone: http://discovery:8761/eureka/
sidecar:
    port: 80

如何查看服务的健康状况?

答: 就本例来说,我们访问地址http://gateway:10000/来了解gateway的情况,如果要知道catelog-service的情况我们就访问http://gateway:10000/hosts/catalog-service地址。hosts后面跟我们的服务的名字即可

spring boot如何创建一个可执行的jar包

答:在服务端的pom文件中增加插件spring-boot-maven-plugin。参考文档http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

如何通过gateway来访问其他服务

答:举例,如果我们要通过gateway来访问catalog-service服务,那么我在浏览器里面输入http://gateway:10000/catalog-service/v1/category这里的/v1/category是由catalog-servicel来决定的,catalog-service则是服务的名字

PS: 一些截图 

参考文档

【1】http://jinnianshilongnian.iteye.com/blog/1902886
【2】http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名稻草鸟人(包含此订阅号二维码)

© 著作权归作者所有

稻草鸟人

稻草鸟人

粉丝 51
博文 12
码字总数 10204
作品 0
上海
后端工程师
私信 提问
加载中

评论(7)

Forezp
Forezp
这个有详细Spring cloud专栏 : http://blog.csdn.net/column/details/15197.html
稻草鸟人
稻草鸟人 博主

引用来自“Leeven”的评论

话说 楼主开发工具是什么啊 android studio ?

回复@Leeven : IDEA,你也可以试试,非常棒的一个开发工具
Leeven
Leeven
话说 楼主开发工具是什么啊 android studio ?
稻草鸟人
稻草鸟人 博主

引用来自“haojii”的评论

gateway 调用 catelog-service 的地方,是不是都依赖于 RestTemplate?

也可以自定义
Super-Hao
Super-Hao
gateway 调用 catelog-service 的地方,是不是都依赖于 RestTemplate?

稻草鸟人
稻草鸟人 博主

引用来自“靓仔007”的评论

嗯,算是入门教程0
嗯,互相学习啦
靓仔007
靓仔007
嗯,算是入门教程0
为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
2018/09/18
508
3
FEBS Cloud v1.1 发布,整合 Spring Cloud Alibaba

FEBS Cloud是一款使用Spring Cloud Greenwich.SR3、Spring Cloud OAuth2 & Spring Cloud Alibaba构建的低耦合权限管理系统,前端(FEBS Cloud Web)采用vue element admin构建。FEBS意指:F...

mrbird
09/22
775
0
微服务管理工具 - Isona

这是一款基于Spring Boot与Spring Cloud构建的微服务管理工具。一个类似于Spring Boot Admin的轮子,但该项目不仅仅是一个轮子,后续将会对接spring4all社区版的微服务脚手架应用实现对使用了...

程序猿DD
2018/11/12
1K
0
微服务选择Spring Cloud还是Dubbo?

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 在阿里巴巴的生态中,微服务逐渐成为主要的服务形态,伴随着容器...

异步社区
2018/04/27
0
0
“Spring三剑客”,助你快速从月入过万的程序员到年薪百万的架构师

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 Spring作为Java开发的事实开发框架,一直以来都被开发者誉为杀手级...

异步社区
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
29分钟前
7
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
32分钟前
4
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
34分钟前
6
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
57分钟前
7
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
58分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部