Spring Cloud入门

微服务

1.概念

​ 微服务是一种以业务功能为主的服务设计概念,每一个服务都具有自主运行的业务功能,对外开放不受语言限制的API (最常用的是 HTTP),应用程序则是由一个或多个微服务组成。

​ 微服务的另一个对比是单体式应用程序。 单体式应用表示一个应用程序内包含了所有需要的业务功能,并且使用像主从式架构 (Client/Server) 或是多层次架构 (N-tier) 实作,虽然它也是能以分散式应用程序来实作,但是在单体式应用内,每一个业务功能是不可分割的。若要对单体式应用进行扩展则必须将整个应用程序都放到新的运算资源(如:虚拟机器)内,但事实上应用程序中最吃资源、需要运算资源的仅有某 个业务部分(例如跑分析报表或是数学算法分析),但因为单体式应用无法分割该部分,因此无形中会有大量的资源浪费的现象。

​ 微服务运用了以业务功能的设计概念,应用程序在设计时就能先以业务功能或流程设计先行分割,将各个业务功能都
独立实作成一个能自主执行的个体服务,然后再利用相同的协定将所有应用程序需要的服务都组合起来,形成一个应用程序。若需要针对特定业务功能进行扩充时,只要对该业务功能的服务进行扩展就好,不需要整个应用程序都扩展,同时,由于微服务是以业务功能导向的实作,因此不会受到应用程序的干扰,微服务的管理员可以视运算资源的需要来配置微服务到不同的运算资源内,或是布建新的运算资源并将它配置进去。虽然使用一般的服务器虚拟化技术就能应用于微服务的管理,但容器技术 (Container Technology) 如Docker 会更加地适合发展微服务的运算资源管理技术。总结起来就是:

  1. 服务种类根据业务划分

  2. 每个服务可独立部署运维且相互隔离

  3. 服务之间通过 API 调用服务

  4. 服务需保证良好的高可用性

  5. 分散式管理以及分散式数据。每个微服务团队有充分自由选择自己团队熟悉的编程语言、数据库和其他中间件等技术栈。

2 特点

2.1 粒度微小

​ 微服务的粒度是根据业务功能来划分的,对于某些复杂的业务来说,可能粒度较大,对于相对简单的业务而言,可能粒度较小。总之,微服务的粒度可大可小,但往往我们更希望它尽可能的小,但又不希望微服务之间有任何的依赖,因此粒度的划分是非常考验架构师水平的事情。

2.2 责任单一

​ 我们需要确保每个微服务只做一件事情,也就是我们经常提到的“单一职责原则”,该原则对微服务的划分提供了指导方针。

2.3 隔离性好

​ 每个微服务相互隔离,且互不影响。也就是说,每个服务运行在自己的进程中。众所周知,进程之间是隔离的,是安
全的,而进程内部或线程之间资源共享的。换句话说,一个微服务出了问题,不会影响到其它微服务受到任何影响。

2.4管理容易

随着业务功能不断增多,微服务的数量也会逐渐增加,我们需要对微服务提供自动化部署与监控预警的能力,才能更
加高效地管理微服务。微服务架构的特点非常明显,可能还有很多,但同时微服务架构也给我们带来了许多挑战 。

3 作用

3.1传统软件架构

3.2微服务架构

3.3 单体架构和微服务架构比较
单体框架微服务架构
整体部署分布式部署
紧耦合松耦合
基于整体系统扩展基于独立服务按需扩展
集中式管理分布式管理
应用无依赖管理微服务中服务之间有较强依赖
局部修改整体部署局部修改局部部署
故障全局性故障隔离非全部
代码会臃肿,难以维护代码易于理解,容易维护
开发效率低开发效率高
资源利用率低资源利用率高
部署简单部署复杂

4 实现

​ 采 用 的 技 术 是 Springcould 采 用eureka 作为发现服务的中间件,采用 maven 分模块开发。

4.1 采用idea+maven构建一个多模块项目

​ 在 父 工 程 中 创 建 三 个 子 模 块 : micro-resgistry ,micro-service, micro-client 三个子模块的类型都是 quick start

4.2导包,在父工程pom导入相关jar包
 <parent>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-parent</artifactId>
        <version>Camden.SR6</version>
    </parent>


    <dependencies>
        <!-- Spring Cloud starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>
        <!-- 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

4.3启动注册中心

​ 在 micro-registry 中配置 eureka 服务器相关内容、编写启动程 序并加上@SpringBootApplication@EnableEurekaServer

server:
  port: 8080
eureka:
  instance:
    hostname: localhost
  client:
    ## 自身服务器不被发现
    register-with-eureka: false
    fetch-registry: false

@SpringBootApplication
@EnableEurekaServer
public class RegistryApplication {
    public static void main(String[] args) {
    	SpringApplication.run(RegistryApplication.class);
    }
}
4.4 编写一个微服务micro-service 发布 hello 的接口

application.yml , ServiceApplication ( 启 动 类 )、HellWorldController 接口发布类ServiceApplication 中 加 上 @SpringBootApplication @EnableDiscoveryClient

server:
  port: 8081
#Application name
spring:
  application:
    name: micro-service
# Discovery Server Access
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/
@RestController
public class HelloController {

    @PostMapping("hello/{name}")
    public String hello(@PathVariable String name){

        return name+" say hello";
    }
}
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceStarter {

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

4.5 编写一个微服务调用 micro-serivce 里面的接口获取数据

​ application.yml,ClientApplication,CallHelloController,CallHelloService 类ClientApplication 类中初始化一个 bean RestTemplate 使用@LoadBalance 开启负载均衡CallHelloService 类 中 , 使 用 RestTemplate 去 调 用micro-service 微服务中的 API 接口

server:
  port: 8082
#Application name
spring:
  application:
    name: micro-client
# Discovery Server Access
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/
app:
  service-url: http://MICRO-SERVICE/

@Service
public class CallHelloService {

    @Value("${app.service-url}")
    private String serviceUrl;

    @Autowired
    private RestTemplate restTemplate;

    public String getValue(String name){
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(serviceUrl + "hello/" + name, null, String.class);
        return responseEntity.getBody();

    }
}

@RestController
public class CallHelloController {

    @Resource
    private CallHelloService callHelloService;

    @GetMapping("hello/{name}")
    //@ResponseBody
    public String callHello(@PathVariable String name){
        return callHelloService.getValue(name);
    }
}

@SpringBootApplication
@EnableDiscoveryClient
public class ClientStarter {

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

    @Bean
    @LoadBalanced //负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值