继续我的Spring-Cloud学习历程, 之前我已经介绍了如何编写典型的基于Spring-Cloud和Netflix OSS的微服务环境的基础架构组件–在此特定实例中,有两个关键组件,用于注册和发现服务的Eureka和Spring Cloud用于维护服务配置集中式配置库的配置。 在这里,我将展示如何开发两个虚拟微服务,一个是简单的“ pong”服务,另一个是使用“ pong”服务的“ ping”服务。

Sample-Pong微服务

处理“ ping”请求的端点是典型的基于Spring MVC的端点:

@RestController
public class PongController {@Value("${reply.message}")private String message;@RequestMapping(value = "/message", method = RequestMethod.POST)public Resource<MessageAcknowledgement> pongMessage(@RequestBody Message input) {return new Resource<>(new MessageAcknowledgement(input.getId(), input.getPayload(), message));}}

它收到一条消息并以确认响应。 在这里,该服务利用配置服务器来获取“ reply.message”属性。 因此,“ pong”服务如何找到配置服务器,可能有两种方式-直接通过指定配置服务器的位置,或通过Eureka查找配置服务器。 我习惯了将Eureka视为事实来源的方法,因此本着这种精神,我正在使用Eureka查找配置服务器。 Spring Cloud使整个流程变得非常简单,它所需要的只是一个“ bootstrap.yml”属性文件,其内容如下:

---
spring:application:name: sample-pongcloud:config:discovery:enabled: trueserviceId: SAMPLE-CONFIGeureka:instance:nonSecurePort: ${server.port:8082}client:serviceUrl:defaultZone: http://${eureka.host:localhost}:${eureka.port:8761}/eureka/

通过“ eureka.client.serviceUrl”属性指定Eureka的位置,并将“ spring.cloud.config.discovery.enabled”设置为“ true”以指定通过指定的Eureka服务器发现配置服务器。

仅需注意 ,这意味着Eureka和Configuration Server必须先完全启动,然后才能尝试提供实际服务,这是先决条件,并且基本假设是在应用程序启动时可以使用Infrastructure组件。

配置服务器具有“ sample-pong”服务的属性,可以使用Config-servers端点进行验证-http:// localhost:8888 / sample-pong / default,8888是我为之指定的端口服务器端点,并应按照以下内容响应内容:

"name": "sample-pong","profiles": ["default"],"label": "master","propertySources": [{"name": "classpath:/config/sample-pong.yml","source": {"reply.message": "Pong"}}]
}

可以看出,该中央配置服务器的“ reply.message”属性将被pong服务用作确认消息。

现在要将此端点设置为服务,所需要做的就是沿着这些行基于Spring-boot的入口点:

@SpringBootApplication
@EnableDiscoveryClient
public class PongApplication {public static void main(String[] args) {SpringApplication.run(PongApplication.class, args);}
}

这样就完成了“ pong”服务的代码。

抽样微服务

因此,现在转到“乒乓”微服务的消费者上,该消费者非常富想象力地称为“乒乓”微服务。 Spring-Cloud和Netflix OSS提供了许多选项来调用Eureka注册服务上的端点,以总结我拥有的选项:

  1. 使用原始的Eureka DiscoveryClient查找托管服务的实例,并使用Spring的RestTemplate进行调用。
  2. 使用Ribbon客户端负载均衡解决方案,可以使用Eureka查找服务实例
  3. 使用Feign ,它提供了一种声明性的方式来调用服务调用。 内部使用功能区。

我和费恩一起去。 所需要的只是一个接口,该接口显示了调用服务的合同:

package org.bk.consumer.feign;import org.bk.consumer.domain.Message;
import org.bk.consumer.domain.MessageAcknowledgement;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
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.ResponseBody;@FeignClient("samplepong")
public interface PongClient {@RequestMapping(method = RequestMethod.POST, value = "/message",produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)@ResponseBodyMessageAcknowledgement sendMessage(@RequestBody Message message);
}

注释@FeignClient(“ samplepong”)内部指向功能区“命名”客户端,称为“ samplepong”。 这意味着该命名客户端的属性文件中必须有一个条目,就我而言,我的application.yml文件中包含以下条目:

samplepong:ribbon:DeploymentContextBasedVipAddresses: sample-pongNIWSServerListClassName: com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerListReadTimeout: 5000MaxAutoRetries: 2

这里最重要的条目是“ samplepong.ribbon.DeploymentContextBasedVipAddresses”,它指向“ pong”服务Eureka注册地址,Ribbon将使用该地址注册服务实例。

该应用程序的其余部分是一个常规的Spring Boot应用程序。 我已经在Hystrix后面公开了此服务调用,该服务可以防止服务调用失败,并且基本上可以包装此FeignClient:

package org.bk.consumer.service;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.bk.consumer.domain.Message;
import org.bk.consumer.domain.MessageAcknowledgement;
import org.bk.consumer.feign.PongClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;@Service("hystrixPongClient")
public class HystrixWrappedPongClient implements PongClient {@Autowired@Qualifier("pongClient")private PongClient feignPongClient;@Override@HystrixCommand(fallbackMethod = "fallBackCall")public MessageAcknowledgement sendMessage(Message message) {return this.feignPongClient.sendMessage(message);}public MessageAcknowledgement fallBackCall(Message message) {MessageAcknowledgement fallback = new MessageAcknowledgement(message.getId(), message.getPayload(), "FAILED SERVICE CALL! - FALLING BACK");return fallback;}
}

“启动”起来

我已经对整个设置进行了docker化,因此启动应用程序集的最简单方法是首先通过以下方式为所有工件构建docker映像:

mvn clean package docker:build -DskipTests

并使用以下命令将其全部调出,假设docker和docker-compose都在本地可用:

docker-compose up

假设一切正常,Eureka应该显示所有已注册的服务,网址为http:// dockerhost:8761 url –

ping应用程序的用户界面应位于http:// dockerhost:8080 url –

此外,Hystrix仪表板应可用于监视对此URL http:// dockerhost:8989 / hystrix / monitor?stream = http%3A%2F%2Fsampleping%3A8080%2Fhystrix.stream的“ pong”应用程序的请求:

参考文献

  1. 该代码位于我的github位置 – https://github.com/bijukunjummen/spring-cloud-ping-pong-sample
  2. 大多数代码都是从spring-cloud-samples存储库大量借用的 – https://github.com/spring-cloud-samples

翻译自: https://www.javacodegeeks.com/2015/07/learning-spring-cloud-writing-a-microservice.html

学习Spring-Cloud –编写微服务相关推荐

  1. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

  2. 基于Spring Boot和Spring Cloud实现微服务架构学习

    目录 Spring 顶级框架 Spring cloud子项目 WHAT - 什么是微服务 微服务简介 微服务的具体特征 SOA vs Microservice HOW - 怎么具体实践微服务 客户端如 ...

  3. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】

    Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为 ...

  4. 《深入理解 Spring Cloud 与微服务构建》第一章 微服务简介

    <深入理解 Spring Cloud 与微服务构建>第一章 微服务简介 文章目录 <深入理解 Spring Cloud 与微服务构建>第一章 微服务简介 一.单体架构及其存在的 ...

  5. 《深入理解Spring Cloud与微服务构建》出版啦!

    作者简介 方志朋,毕业于武汉理工大学,CSDN博客专家,专注于微服务.大数据等领域,乐于分享,爱好开源,活跃于各大开源社区.著有<史上最简单的Spring Cloud教程>,累计访问量超过 ...

  6. 基于 Spring Boot 和 Spring Cloud 实现微服务架构

    前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而来,很多描述的重点也都偏向于作者自身碰到的问题,这样就很容易让你理解和操作出现偏差 ...

  7. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  8. Spring Cloud构建微服务架构(一)服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  9. 干货|基于 Spring Cloud 的微服务落地

    转载自 干货|基于 Spring Cloud 的微服务落地 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需 ...

  10. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

最新文章

  1. 关于 synchronizeOnSession
  2. 中国抛光打磨机器人行业发展方向分析与十四五战略规划研究报告2022年版
  3. webstrom js 代码不高亮
  4. c++预处理命令 #include用法
  5. P4310-绝世好题【位运算,dp】
  6. node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  7. mac mysql ngram_mac 下 sphinx + mysql + php 实现全文搜索(xampp)(3)sphinx 的配置项解析...
  8. osx jni 开发 1
  9. java 中的集合_JAVA中的集合
  10. windows 安装metis_Win10 VS2013 suitesparse-metis-for-windows 1.3.1
  11. vue静态资源打包中的坑与解决方案
  12. ueditor 图片水印 php,[UEditor]上传图片自动添加水印
  13. 电脑小知识:电脑怎么查看ip地址?
  14. 支付宝API使用流程
  15. python turtle画太极的代码_python turtle 绘制太极图的实例
  16. html中怎么给表格增加序号,如何给word表格中添加编号
  17. 如何屏蔽掉某网址不能访问
  18. 苹果教你如何保持iPhone电池健康、延长电池寿命
  19. 泛微软件的CMMI配置管理实施法
  20. 北京有哪些比较酷的互联网公司?

热门文章

  1. 人脸认证源码faceIdentify
  2. Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
  3. SQL注入问题及预防方法
  4. 三星系统和鸿蒙系统,又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!...
  5. 下载bilibli网站视频
  6. css 图片换行_好程序员web前端学习路线分享CSS浮动-文档流篇
  7. tomcat(2)一个简单的servlet容器
  8. HDU1176(DP)
  9. ogm neo4j_Neo4J OGM与Quarkus
  10. 谷歌 recaptcha_在Spring Boot应用程序中使用Google reCaptcha