bitfinex
              大数据

              Spring Cloud 上手实战-架构解析及实作

              Spring简介

              为什么要使用微服务

              • 单体应用:

              目前为止绝大部分的web应用软件采用单体应用,所有的应用的用户UI、业务逻辑、数据库访问都打包在一个应用程序上。

              在线制图 springCloud设计

              缺点:

               开发相互干扰,随着应用的不断升级沟通协调成本增加 应用上线由于某个功能升级导致需要整体的构建、整体测试、整体发布 
              • 微服务
              在线制图 springCloud设计

              把单体应用拆分成小的、松藕合分布式服务的形式 
              每个应用一定是独立构建、独立部署与测试,应用也是独立发布,应用于应用直接通常通过restful API接口的形式进行相互调用。 
              解决了单体应用带来的困扰。 

              Spring cloud 是什么

              发展历史

              1. 2002,Rod Johonson发表了<<Expert One-on-One J2EE Design and Development>>,
              2. 包含了3万行的代码在包com.interface21中
              3. 2003,Juerge Hoeller,Yann Caroff 联系Rod,将书中代码开源,Yann提出Spring这个词,冠于书中代码;
              4. 并发布0.9,使用Apache 2.0协议;Thomas Risberg负责Spring JDBC;Ben Alex将Acegi Security贡献给Rod和Juergen
              5. 2004,1.0发布
              6. 2005,<<Professional Java Development with Spring Framework>> <<Pro Spring>>出版;1.2.6发布。
              7. AspectJ Leader Adrian Coyler加入Interface21作为首席科学家;
              8. 2006,Security 1.0、Spring webflow 1.0发布;Spring 2.0发布;
              9. 2007,Spring Batch、WebService、Integration发布;Spring 2.5发布;
              10. 2008,Spring Integration 1.0,Spring 2.5.6,Spring Batch 1.0;买了g2One,一家提供Groovy and Grails的公司;
              11. 2009,被VMWare发了42亿美金买下;Spring Python、STS发布、3.0发布(将包拆开,不提供超级包),买了Cloud Foundry;
              12. 2010,VMWare买了RabbitMQ公司,获得RabbitMQ和Redis技术;
              13. 2011,Spring 3.1、Spring AMQP、Spring Data JPA、Spring-data-common 1.0
              14. 、Spring Data Redis、Spring Data Mongodb发布;
              15. 2012,Rod Johnson离开VMWare;Spring Android、Mobile发布;
              16. 2013,VMWare 和 EMC 合力组建了一家公司,Pivotal。Spring 4.0、Spring Boot发布;
              17. 2014,Spring 4.1.3、SpringBoot 1.0发布;
              18. 2015,Spring 4.2、4.3发布;
              19. 2016,Spring 4.3 GA
              20. 2017,Spirng 5.x

              Spring的出现让EJB等重量级的容器技术逐渐走向末路。 
              Spring 通过对Bean的生命周期的管理,可以快速方便的实现业务的逻辑处理。 
              Spring 可以方便的整合几乎所有的主流的开源项目如JPA,缓存,消息组合等等,方便的进行开发。

              Spring Cloud实战

              本实战目的: 
              全程演示如何创建一个基础的、可用的Spring cloud分布式应用系统 
              演示Spring Cloud各部分组件如何在应用之前协调、调用。 
              了解整个Spring Cloud的项目基本情况,有一个初步的认识。 
              本实战JAVA采用JDK8 
              Spring Boot版本采用最新2.1.0 release. 
              Spring Cloud版本采用Greenwich.M1。

              2.2.1. Spring Cloud基础搭建

              使用

              阿里云的spring cloud 架构图在线设计地址: https://www.freedgo.com 即可使用Freedgo Desing 进行图形设计.

              架构预览地址:

              https://www.freedgo.com/draw_index.html?#Uhttps://www.freedgo.com/templates/network/springcloud_aliyun.xml

              Freedgo Design 是一in款在线绘制专业图形的网站。Freedgo Design可以绘制各种类型的图形,针对业务逻辑的流程图,软件设计ER模板,工作流,各种云平台的系统部署架构图包括阿里云、AWS云、腾讯云、Oracle、Asure云、IBM云平台等。

              在线制图 springCloud设计
              2.2.1.1. 建立基础代码

              开发工具:Intellij idea 
              1、 建立一个mvn 工程项目 
              使用的java jdk 采用jdk8

              2.2.1.2. 服务发现
              在线制图 springCloud设计
              在线制图 springCloud设计
              在线制图 springCloud设计
              在线制图 springCloud设计

              建立子??閐iscovery-service

              在线制图 springCloud设计
              在线制图 springCloud设计
              在线制图 springCloud设计
              在线制图 springCloud设计

              我们可以看到mvn 依赖导入了netflix-eureka-server 
              Spring boot 会启动服务发现服务

              <dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency> 
              2.2.1.3. 服务配置
              在线制图 springCloud设计
              在线制图 springCloud设计
              在线制图 springCloud设计

              建立子??閏onfig-service

              <dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-config-server</artifactId></dependency> 

              2.2.1.4. 服务路由

              在线制图 springCloud设计
              在线制图 springCloud设计
              在线制图 springCloud设计

              服务路由采用 Netflix Zuul 
              通过服务路由作为eureka client,可以被发现服务监控

              <dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency> 

              基础的组件创建完毕

              2.2.1.5. 用户认证中心

              在线制图 springCloud设计
              在线制图 springCloud设计

              2.2.1.6. 业务服务???/h3>
              在线制图 springCloud设计
              在线制图 springCloud设计


              org.springframework.boot
              spring-boot-starter-web


              org.springframework.cloud
              spring-cloud-starter-oauth2


              org.springframework.cloud
              spring-cloud-starter-security

              2.2.2. 服务发现

              在线制图 springCloud设计

              传统服务发现方式通过网络DNS和负载均衡设备实现,需要网络和硬件设置支持,维护成本高,网络环境复杂 
              居于云的服务发现具有如下优点 
              高可用,热部署 
              负载均衡 
              健康检查,容错机制 
              抽象服务的逻辑名称 
              使用Spring与Netflix Eureka实现服务发现 

              实现服务发现功能需要配置服务发现端及需要注册服务配置客户端 
              1、 发现服务端配置 
              服务注册需要30 s 的时间才能显示在 Eureka 服务中,因为 Eureka 需要从服务接收3次连续心跳包 ping,每次心跳包 ping 间隔10 s,然后才能使用这个服务。在部署和测试服务时,要牢记这一点。 
              application.yml

              server:
              port: 8761
              # Eureka 服务器将要监听的端口
              eureka:
              client:
              registerWithEureka: false #不要使用 Eureka 服务进行注册
              fetchRegistry: false #不要在本地缓存注册表信息

              使用一个新的注解 @EnableEurekaServer ,就可以让我们的服务成为一个 Eureka 服务

              2、 服务发现客户端配置 
              以config-service为例 
              需要做2件事情 
              1、 成为服务发现的客户端


              org.springframework.cloud
              spring-cloud-starter-netflix-eureka-client

              2、 配置application.yml(对应config-server来说我们只需要配置如下)

              spring:  cloud:    config:      discovery:        enabled: true 

              启动运行查看

              在线制图 springCloud设计
              在线制图 springCloud设计

              http://localhost:8761/eureka/apps/config-service。 
              应用作为服务发现的客户端设置 
              1、 添加客户端依赖


              org.springframework.cloud
              spring-cloud-starter-netflix-eureka-client

              2、 配置application.yml

              spring:
              application:
              name: business_service
              eureka:
              instance:
              preferIpAddress: true
              #注册服务的 IP,而不是服务器名称
              client:
              registerWithEureka: true #向 Eureka 注册服务
              fetchRegistry: true
              serviceUrl: #拉取注册表的本地副本
              defaultZone: http://localhost:8761/eureka/ #Eureka 服务的位置

              同样通过mvn spring-boot:run 打开 http://localhost:8761 ,business_service已经注册成功

              使用服务发现查服务

              2.2.3. 用户认证中心

              在线制图 springCloud设计

              OAuth2协议说明:

              整体OAuth协议包括两方面: 
              1、 访问授权:用户必须通过授权获取令牌 
              2、 资源权限:通过授权的用户访问受?;さ淖试?,根据定义访问权限来决定是否可以访问资源 
              配置说明: 
              启用OAuth授权服务 
              增加 @EnableAuthorizationServer 用于告诉 Spring Cloud,该服务将作为 OAuth2 服务

              package com.yuaoq.train.business;
              import org.springframework.boot.SpringApplication;
              import org.springframework.boot.autoconfigure.SpringBootApplication;
              import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
              @SpringBootApplication
              @EnableResourceServer
              @EnableAuthorizationServer
              public class DemoApplication {
              public static void main(String[] args) {
              SpringApplication.run(DemoApplication.class, args);
              }
              }

              OAuth访问授权配置,配置注册的客户端应用程序

              @Configuration
              public class Auth2Config extends AuthorizationServerConfigurerAdapter {
              @Autowired
              private AuthenticationManager authenticationManager;
              @Autowired
              private UserDetailsService userDetailsService;
              // 覆盖 configure()方法。这定义了哪些客户端将注册到服务
              @Override
              public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
              clients.inMemory()
              .withClient(“yuaoq”)
              .secret(“{noop}secret”)
              .authorizedGrantTypes(
              “refresh_token”,
              “password”,
              “client_credentials”)
              .scopes(“webclient”,”mobileclient”);
              }
              // 该方法定义了 AuthenticationServerConfigurer 中使用的不同组件。这段代码告诉 Spring 使用 Spring 提供的默认验证管理器和用户详细信息服务
              @Override
              public void configure(AuthorizationServerEndpointsConfigurer endpoints)
              throws Exception {
              endpoints
              .authenticationManager(authenticationManager)
              .userDetailsService(userDetailsService);
              }
              }

              配置用户权限

              @Configuration
              public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
              @Override
              @Bean
              // AuthenticationManagerBean 被 Spring Security 用来处理验证
              public AuthenticationManager authenticationManagerBean() throws Exception {
              return super.authenticationManagerBean();
              }
              // Security 使用 UserDetailsService 处理返回的用户信息,这些用户信息将由 Spring Security 返回
              @Override
              @Bean
              public UserDetailsService userDetailsServiceBean() throws Exception {
              return super.userDetailsServiceBean();
              }
              @Override
              protected void configure(AuthenticationManagerBuilder auth) throws Exception {
              //  configure()方法是定义用户、密码和角色的地方
              auth.inMemoryAuthentication()
              .withUser(“admin”)
              .password(“{noop}password”)
              .roles(“ADMIN”,”USER”)
              .and()
              .withUser(“anyone”)
              .password(“{noop}password”)
              .roles(“USER”);
              }
              }

              获取用户信息(提供给其他服务获取用户信息使用)

              @GetMapping(value = “/auth/user”)
              public Map user(OAuth2Authentication user) {
              Map userInfo = new HashMap<>();
              userInfo.put(“user”, user.getUserAuthentication().getPrincipal());
              userInfo.put(“authorities”, AuthorityUtils.authorityListToSet(user.getUserAuthentication().getAuthorities()));
              return userInfo;
              }

              在线制图 springCloud设计

              通过postman测试 
               
              自此提供了一个用户认证的微服务???

              2.2.3.1. 业务??槲⒎?/h4>

              1、 对外提供restful Api 
              @RestController :由spring web提供的居于restful 的接口标签 
              生成一个restful api

              @PostMapping(“/list”)
              public ResponseEntity> getBusiness() throws Exception {
              List list = new ArrayList();
              list.add(“a”);
              list.add(“b”);
              return Optional.of(list)
              .map(a -> new ResponseEntity>(a, HttpStatus.OK))
              .orElseThrow(() -> new Exception(“error”));
              }

              使用postman调用接口

              在线制图 springCloud设计

               
              从postman返回的结果可以看到401,未授权。 
              因为business_service服务引入了spring-cloud-starter-security 那么默认是会对所有访问做安全控制。

              在线制图 springCloud设计

              2、 服务的授权?;?nbsp;
              现在business/list 是未授权,那怎么配置一个受?;さ膐auth2.0资源,通过如下步骤 
              设置服务是一个受oauth?;さ淖试?nbsp;
               
              定义应用的OAuth属性定义回调 URL

              security:  oauth2:    resource:      user-info-uri: http://localhost:8282/auth/user 

              定义授权用户可以访问

              @Configuration
              public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
              //  antMatchers()允许开发人员限制对受?;さ?URL 和 HTTP DELETE 动词的调用
              // hasRole()方法是一个允许访问的角色列表,该列表由逗号分隔
              @Override
              public void configure(HttpSecurity http) throws Exception {
              http.authorizeRequests()
              .antMatchers(HttpMethod.POST, “/api/v1/business/**”)
              .hasRole(“ADMIN”)
              .anyRequest()
              .authenticated();
              }
              }

              在线制图 springCloud设计

              该段代码说明具有ADMIN角色的用户可以访问/api/v1/business/ 下的所有的POST 请求 
              验证如下: 

              至此通过OAuth2.0?;の⒎竦幕咀龇ㄒ丫瓿?。

              2.2.4. 服务路由网关 
              服务网关:服务客户端不再直接调用服务。取而代之的是,服务网关作为单个策略执行点(Policy Enforcement Point,PEP),所有调用都通过服务网关进行路由,然后被路由到最终目的地。 
              @EnabeZuulServer 使用此注解将创建一个 Zuul 服务器,它不会加载任何 Zuul 反向代理过滤器,也不会使用 Netflix Eureka 进行服务发现.

              在线制图 springCloud设计

              成为一个服务网关步骤: 
              1、 添加 @EnableZuulProxy 
               
              2、 在application.yml添加route 规则

              zuul:  sensitive-headers: set-cookies  routes:    business_service: /busi/** 

              通过postman测试如下:

              在线制图 springCloud设计

              我还没有学会写个人说明!

              Spring入门这一篇就够了

              上一篇

              Oracle调度作业引起的空间骤增问题处理记录

              下一篇

              你也可能喜欢

              Spring Cloud 上手实战-架构解析及实作

              长按储存图像,分享给朋友

              ITPUB 每周精要将以邮件的形式发放至您的邮箱


              微信扫一扫

              微信扫一扫

              百度|中国纪委国家监委网站|北京纪检监察网|bitfinex注册 | bitfinex平台 | www.baidu.com-百度百科|

              健康遊戲忠告:抵制不良遊戲拒絕盜版遊戲注意自我保護謹防受騙上當適度遊戲益腦沉迷遊戲傷身合理安排時間享受健康生活

              備案號:皖B2-2334451本站www.837996.com所有