android系统定制开发微服务介绍与 SpringCloud Eureka

 哈喽~大家好,android系统定制开发前端时间我们完结了JavaEE框架篇,android系统定制开发从现在开始呢,android系统定制开发开始了章节了,android系统定制开发这篇就来看看android系统定制开发微服务介绍与 SpringCloud Eureka。

 🥇个人主页:             

🥈 系列专栏:       

🥉推荐专栏: 

目录


一、微服务介绍

1、android系统定制开发什么是微服务?

android系统定制开发微服务是分布式架构的一种,android系统定制开发分布式架构其实就是要android系统定制开发把服务做一个拆分,而springcloudandroid系统定制开发只是解决了拆分过程中的服务治理问题。

在单体架构中,我们把所有的服务都写在一起,随着业务的复杂代码的就会越来越高,不便于将来的升级维护。

所以往往需要拆分这些服务,微服务在拆分的时候,会根据业务功能模块把一个单体的应用拆分成许多个独立的项目,每个项目完成一部分的业务功能,然后独立开发和部署。这些独立的项目就成为一个微服务。进而构成一个服务集群。

举例: 一个商城系统就得提供相当多的服务, 比如订单服务,用户功能,商品服务,支付服务等等,这些模块如果使用单体架构来实现,那么耦合度会相当高,开发难度也会很大。如果使用微服务开发,把每一个服务都当成一个单体应用来开发,那么订单服务,用户服务,商品服务,支付服务等模块,每一个就成为一个微服务。

由这些微服务构成整个的商城系统。这样明显是更加合理的。每个服务也可以根据业务的需要去进行集群部署。一方面降低了服务的耦合,一方面有利于服务的维护升级。

2、单体架构与分布式架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

优点:架构简单、部署成本低

缺点:耦合度高(维护困难、升级困难)

分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

优点:降低服务耦合、有利于服务升级和拓展。

缺点:服务调用关系错综复杂

微服务的架构特征:

单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责

自治:团队独立、技术独立、数据独立,独立部署和交付

面向服务:服务提供统一标准的接口,与语言和技术无关

隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

微服务的上述特性其实是在给架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

因此,可以认为微服务是一种经过良好架构设计的分布式架构方案

但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。

其中在Java领域最引人注目的就是SpringCloud提供的方案了。

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

其中常见的组件包括:

3、总结

单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统

分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

微服务:一种良好的分布式架构方案

①优点:拆分粒度更小、服务更独立、耦合度更低

②缺点:架构非常复杂,运维、监控、部署难度提高

SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

二、SpringCloud 微服务项目起步

1、服务拆分和远程调用

任何分布式架构都离不开服务的拆分,微服务也是一样。

微服务拆分时的几个原则:

不同微服务,不要重复开发相同业务

微服务数据独立,不要访问其它微服务的数据库

微服务可以将自己的业务暴露为接口,供其它微服务调用

2、项目结构

项目结构如下

cloud-demo:父工程,管理依赖

order-service:订单微服务,负责订单相关业务

user-service:用户微服务,负责用户相关业务

创建数据库,导入相应的表文件

导入成功之后,启动两个服务(order-service 与 user-service),输入网址

发现 user 是 null,因为这是两个不同的项目,连接两个不同的数据库。order模块当然访问不了user模块,这就是分布式的思想。

那么如何获取user呢?

需求:修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

因此,我们需要在order-service中 向user-service发起一个http的请求,调用{userId}这个接口。

3、代码实现

大概的步骤是这样的:

注册一个RestTemplate的实例到Spring容器,修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User,将查询的User填充到Order对象,一起返回

注册RestTemplate

我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例

  1. @Bean
  2. public RestTemplate restTemplate() {
  3.    return new RestTemplate();
  4. }

在service写入代码

  1. @Service
  2. public class OrderService {
  3.    @Autowired
  4.    private OrderMapper orderMapper;
  5.    @Autowired
  6.    private RestTemplate restTemplate;
  7.    public Order queryOrderById(Long orderId) {
  8.        // 查询订单
  9.        Order order = orderMapper.findById(orderId);
  10.        // 远程调用user
  11.        // url地址
  12.        String url = "http://localhost:8081/user/" + order.getUserId();
  13.        // 发起调用
  14.        User user =restTemplate.getForObject(url, User.class);
  15.        // 存放order
  16.        order.setUser(user);
  17.        // 返回
  18.        return order;
  19.   }
  20. }

输入一样的网址,跑一下

4、提供者与消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务,我把数据给其他人)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口,我去拿其他人的数据)

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

对于A调用B的业务而言:A是服务消费者,B是服务提供者

对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

三、SpringCloud

1、Eureka 简介

Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。

假如我们的服务提供者user-service部署了多个实例,order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?有多个user-service实例地址,order-service调用时该如何选择?order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

2、流程

问题1:order-service如何得知user-service实例地址?

获取地址信息的流程如下:

user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册,eureka-server保存服务名称到服务实例地址列表的映射关系,order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取

问题2:order-service如何从多个user-service实例中选择具体的实例?

order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用

问题3:order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳,当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除,order-service拉取服务时,就能将故障实例排除了

3、代码展示

搭建eureka-server

使用maven来创建eureka-server服务,引入SpringCloud为eureka提供的starter依赖:

  1. <dependency>
  2.    <groupId>org.springframework.cloud</groupId>
  3.    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  4. </dependency>

编写启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

  1. package cn.itcast.eureka;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer
  7. public class EurekaApplication {
  8.    public static void main(String[] args) {
  9.        SpringApplication.run(EurekaApplication.class, args);
  10.   }
  11. }

编写一个application.yml文件(写到eureka-server里面)

  1. server:
  2. port: 10086
  3. spring:
  4. application:
  5.   name: eureka-server
  6. eureka:
  7. client:
  8.   service-url:
  9.     defaultZone: http://127.0.0.1:10086/eureka

启动微服务,然后在浏览器访问:

出现这个界面就成功了

下面,我们将user-service注册到eureka-server中去。

在user-service的pom文件中,引入下面的eureka-client依赖:

  1. <dependency>
  2.    <groupId>org.springframework.cloud</groupId>
  3.    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>

在user-service中,修改application.yml文件

  1. spring:
  2.  application:
  3.    name: userservice
  4. eureka:
  5.  client:
  6.    service-url:
  7.      defaultZone: http://127.0.0.1:10086/eureka

再创建一个user-service,在VM选项写入 -Dserver.port=8082,这是SpringBoot窗口会出现两个user-service启动配置,不过,第一个是8081端口,第二个是8082端口。

启动两个user-service实例,查看eureka-server管理页面

同样的,order-service也是一样的操作,这就不一一演示了

如何 在eureka-server中拉取user-service服务的实例列表,并且实现负载均衡?

在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:

spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。

在网址输入 访问

效果

不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发