jjzjj

什么是微服务?

啃瓜子的松鼠 2025-02-02 原文

一、什么是微服务?

​ 微服务是一种分布式架构,分布式架构就是把服务做拆分,在我们的传统单体架构中,我们把所有的服务都写在一起,随着业务的扩大我们的代码耦合度会变得越来越高,后期维护起来也很不方便。微服务就是把模块拆分,把我们整个项目拆解分成许多独立的子项目,每个子项目之间独立开发和部署,子项目也有自己独立的功能,这些独立的子项目就形成了微服务,不同的子项目就进而形成一个服务集群。

​ 举例说明:一个商城系统很多模块组成,例如订单模块、用户功能、商品服务、支付模块等,这些模块如果采用单体架构,代码之间的耦合度会非常高,也不便于后期的维护,当一个模块出现问题时整个项目也会受到影响。如果采用微服务,每个模块独立开发,由这些子模块构成整个商城系统,有利于提升我们的开发效率,也便于后期的维护。

单体架构:

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

缺点:耦合度高。

微服务架构:

优点:耦合度低、便于后期维护扩展。

缺点:部署成本高、需要实线远程调用。

二、微服务特征

三、微服务中各组件的作用

注册中心:记录微服务中每个服务的ip、端口、能干什么事等信息。(我们调用微服务中的某个服务时,可能服务A需要调用服务B,服务B需要调用服务C,注册中心负责记录服务之间的调用关系,我们调用服务时找注册中心就可以了)。

配置中心:统一管理每个服务的配置信息,如果需要变更某个服务的配置信息,只需找到配置中心即可。

网关服务:形如小区保安,能对用户身份做校验,另一方面可以把用户的请求路由到具体的服务中去。

四、微服务技术对比

以Spring Cloud Alibaba为重点学习。

自我建议学习第三种方案:Spring Cloud Alibaba + Dubbo

五、微服务远程调用

在单体项目中要实线服务的调用可直接调用(调用对应的service方法),由于微服务中各模块是独立的,各自的数据库都是不可见的,因此通过远程调用来实现互相调用:

  1. 注册RestTemplate
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

    //创建RestTemplate并注入Spring容器
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  1. 修改OrderService(OrderServiceImpl)
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        //1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.利用RestTemplate发起http请求,查询用户
        //2.1.远程调用user信息
        String url = "http://localhost:8081/user/" + order.getUserId();
        //2.2.发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        //3.封装user到Order
        order.setUser(user);
        //4.返回
        return order;
    }
}

六、消费者与提供者

服务提供者:提供接口给其他微服务调用。

服务消费者:调用其他微服务的接口。

一个微服务既可以是消费者,也可以是提供者,例如服务A调用服务B,服务B又调用服务C,因此B即使消费者又是提供者。对于一个微服务具体是消费者还是提供者,是相对的。

七、Eureka注册中心

由于微服务远程调用地址很多,并且地址也在不停的发生变化,因此不能每次都写死调用的地址,并且我们的服务提供者又很多,也不知道到底该调用哪一个提供者,因此采用Eureka,它替我们解决此问题。

Eureka作用:

在Eureka中,微服务分为客户端和服务的两类,服务端记录服务信息,客户端记录的是服务提供者和服务消费者。

有关什么是微服务?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  7. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

随机推荐