文档章节

spring cloud-综合使用使用技术实现微服务应用

Original123
 Original123
发布于 2017/03/17 11:33
字数 1769
阅读 3
收藏 0

在之前的章节,我们已经实现了配置服务器、注册服务器、微服务服务端,实现了服务注册与发现。这一章将实现微服务的客户端,以及联调、实现整个spring cloud框架核心应用。

 

  • cloud-config-server:配置服务器
  • cloud-eureka-server:eureka注册服务器
  • cloud-simple-service:一个使用mybatis的数据库应用,服务端
  • cloud-simple-ui:webui客户端

  我们先来看看如何实现webui客户端。在spring boot中,已经不推荐使用jsp,所以你如果使用jsp来实现webui端,将会很麻烦。这可能跟现在的开发主流偏重移动端有关,跟微服务有关,跟整个时代当前的技术需求有关。单纯以html来作为客户端,有很多好处,比如更利于使用高速缓存;使后台服务无状态话,更利于处理高并发;更利于页面作为服务,小服务组合成大服务等。

  我们首选来创建webui应用,参考Git cloud-simple-ui工程:

   

         这个应用包括前端html页面,还包括一个后台controller浅层。这是一个前端应用,为什么要包括controller浅层?这是因为这个controller浅层是用来做服务组合的,因为一个页面可能涉及到调用多个服务,而这些服务又有可能涉及事务和并发问题,所以还是需要靠Java来完成。当然,也可以单独编写一个api gateway来实现这一层,可以使用GoNode.js语言等,也可以使用java/netty(主流还是java,因为开发部署效率高)。

       Controller层的WebApplication就是这个应用的入口,代码如下:  

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

  这些注解大都在前面提到过用法:

  @SpringBootApplication相当于@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解合用。

  @EnableEurekaClient配置本应用将使用服务注册和服务发现,注意:注册和发现用这一个注解。

  @EnableHystrix表示启用断路器,断路器依赖于服务注册和发现。

  Controller层的service包封装了服务接口访问,UserService类代码如下:

  @Service

  public class UserService {

          @Autowired

    RestTemplate restTemplate; 

    final String SERVICE_NAME="cloud-simple-service";        

     @HystrixCommand(fallbackMethod = "fallbackSearchAll")

    public List<User> searchAll() {

      return restTemplate.getForObject("http://"+SERVICE_NAME+"/user", List.class);

    }   

    private List<User> fallbackSearchAll() {

               System.out.println("HystrixCommand fallbackMethod handle!");

               List<User> ls = new ArrayList<User>();

               User user = new User();

               user.setUsername("TestHystrix");

               ls.add(user);

               return ls;

    }

  }

  这里使用了断路器,就是@HystrixCommand注解。

断路器的基本作用就是@HystrixCommand注解的方法失败后,系统将自动切换到fallbackMethod方法执行。断路器Hystrix具备回退机制、请求缓存和请求打包以及监控和配置等功能,在这里我们只是使用了它的核心功能:回退机制,使用该功能允许你快速失败并迅速恢复或者回退并优雅降级。

  这里使用restTemplate进行服务调用,因为使用了服务注册和发现,所以我们只需要传入服务名称SERVICE_NAME作为url的根路径,如此restTemplate就会去EurekaServer查找服务名称所代表的服务并调用。而这个服务名称就是在服务提供端cloud-simple-service中spring.application.name所配置的名字,这个名字在服务启动时连同它的IP和端口号都注册到了EurekaServer。

  封装好服务调用后,你只需要在Controller类里面注入这个服务即可:

  @RestController

  public class UserController {       

       @Autowired

       UserService userService;      

       @RequestMapping(value="/users")

       public ResponseEntity<List<User>> readUserInfo(){

              List<User> users=userService.searchAll();         

              return new ResponseEntity<List<User>>(users,HttpStatus.OK);

       }

  }

  至此这个webui应用的java端就开发完了,我们再来看页面模块。

  可以看到,页面文件都放在resources\static目录下面,这是spring boot默认的页面文件主文件夹,你如果在里面放一个index.html,那么直接访问根路径http://localhost:8080/会直接定位到这个页面。所以这个static就相当于传统web项目里面的webapp文件夹。

  在这里包括两个页面index.html和user-page.html,用户访问首页时将会加载user-page.html子页面。

  首页index.html页面核心代码如下:

  <html ng-app="users">

  <head>   

    <script src="js/app.js"></script>

  </head>

  <body>

  <div ng-view class="Container">

  </div>

  </body>

  </html>

  页面user-page.html代码如下:

  <div>

  <ul ng-controller="userCtr">

    <li ng-repeat="item in userList">

  {{item.username}}   

  </li>

  </ul>

  </div>

  app.js页面代码如下:

  angular.module('users', ['ngRoute']).config(function ($routeProvider) {

  $routeProvider.when('/', {

        templateUrl: 'user-page.html',

        controller: 'userCtr'

  })

  }).controller('userCtr', function ($scope, $http) {

  $http.get('users').success(function (data) {

           //alert(data+"");

        $scope.userList = data;

  });

  });

  这里使用了AngularJS库。Angular可以绑定模型数据到页面变量,在user-page.html看到的{{item.username}}就是它的绑定语法,这个语法根jsp或freemarker这些模板技术都类似,只不过Angular是用在客户端的,而前者是用在服务端的。

  至此这个webui应用就开发完了,改一下配置文件和pom文件就可以运行了。配置文件包括配置管理服务器地址,注册服务器地址等,在bootstrap.properties文件中:

  spring.cloud.config.uri=http://127.0.0.1:${config.port:8888}

  spring.cloud.config.name=cloud-config

  spring.cloud.config.profile=${config.profile:dev}

  eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/

  spring.application.name=simple-ui-phone

  这些配置我们在上一章已经提到过了,这里不再解释。因为使用了断路器,所以相比上一章的cloud-simple-service项目,需要加入hystrix依赖,只有一个starter依赖:

  <dependency>

    <groupId>org.springframework.cloud</groupId>

  <artifactId>spring-cloud-starter-hystrix</artifactId>

  </dependency>

  Spring把事情做的如此简单,不管是服务注册还是断路器,连同注解加配置文件再加上依赖总共不超过十行代码。如此简单就可以使用一个分布式应用,也难怪国内外业内人员都高度重视这个框架,在简单和速度就是硬道理的今天,这个框架有着重要的意义。

   剩下最重要的事情就是进行部署了,我们以此使用命令启动这些服务及应用:

  1)  java -jar cloud-config-server-0.0.1.jar,启动配置服务器,固定绑定端口8888;

  2)  java -jar cloud-eureka-server-1.0.0.jar,启动注册服务器,固定绑定端口8671;

  3)  java -jar cloud-simple-service-1.0.0.jar --server.port=8081 >log8081.log,启动后台服务,绑定端口8081

  4)  java -jar cloud-simple-service-1.0.0.jar --server.port=8082 >log8082.log,启动后台服务,绑定端口8082

  5)  java -jar cloud-simple-ui-1.0.0.jar --server.port=8080 >log8080.log,启动前端ui应用,绑定端口8080

  运行http://localhost:8080/即可看到运行的结果。其中“>log8080.log”表示输出日志到文件。

  这里运行了两个cloud-simple-service实例,主要是为了演示ribbon负载均衡。默认情况下使用ribbon不需要再作任何配置,不过它依赖于注册服务器。当然也可以对ribbon进行一些自定义设置,比如配置它的超时时间、重试次数等。启用了负载均衡后,当我们关掉前端页面上次指向的服务时(从日志中看),比如我们刷新页面看到它调用的是8081服务,那么我们关掉这个服务。关掉后再刷新会发现执行了断路器,过几秒再刷新,它已经切换到了8082这台服务器,这说明负载均衡起作用了。

© 著作权归作者所有

共有 人打赏支持
Original123
粉丝 7
博文 64
码字总数 86634
作品 0
徐汇
架构师
私信 提问
放弃 Dubbo,选择最流行的 Spring Cloud 微服务架构实践与经验总结

前言 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的。从最初的开源软件云收藏来熟悉 Spring Boot,到项目中的慢慢使用,再到最后全面拥抱 Spring Cloud。 这篇文章给...

Java微服务
01/08
0
0
Dubbo和Spring Cloud微服务架构

微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标...

烛光Java后端开发
2018/10/24
0
0
中小企业对Spring Cloud微服务架构实践经验总结的一些思考

Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经走了一年多。 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的。从最初的开源软...

Java大蜗牛
2018/08/13
0
0
听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构吧

微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标...

Java小铺
2018/09/15
0
0
“Spring三剑客”,助你快速从月入过万的程序员到年薪百万的架构师

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

异步社区
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让...

程序猿DD
昨天
8
0
SpringSecurity认证流程源码级详解

SpringSecurity认证流程源码级详解 认证流程说明 认证结果如何在多个请求之间共享 获取认证用户信息

chendom
昨天
2
0
C语言中的volatile——让我保持原样

volatile译为:易变的。这不是和题目的让我保持原样矛盾了吗?其实不然,在变量前加上该关键字修饰,确实是告诉编译器,这个变量是一个容易改变的变量,不要对它进行优化,每次都要到变量的地...

天王盖地虎626
昨天
2
0
五、RabbitMQ的消息属性(读书笔记)

简介 当使用RabbitMQ发布消息时,消息又AMQP规范中的三个低层帧类型组成: Basic.publish方法帧; 内容头帧; 消息体帧; 这三种帧类型按顺序一起工作,以便消息传递时完好无损。 其中,内容...

XuePeng77
昨天
2
0
JavaEE开发的颠覆者SpringBoot实战摘要笔记

一、注解理解 1.spring注解 1)@Configuration/@ComponentScan/@Bean注解实现java方式的配置。 @Configuration代替xml文件 @ComponentScan指定扫描范围 @Bean代替bean标签 2)@Bean、@Componen...

啃不动地大坚果
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部