SpringCloud入门

1.为什么需要spring cloud

要使用spring cloud 首先要先了解 :Monolith(单体应用)架构 和 MicroService(微服务)架构

1.1.什么是单体应用架构

单体应用架构:所有的jar包,在整合成打成一个war 部署tomcat运行
缺点:
如果多写一个功能,在部署,编译 测试上面变得更加 难
技术选型上面不是很灵活
扩展避免麻烦 浪费很多空间

1.2.什么是微服务架构

微服务架构: 把以前整个服务进行拆分成微小的服务;每个服务独立运行 独立部署 ,独立维护 --分布式
好处:
部署,编译,测试 更加简单
技术比较灵活 --每个服务都可以使用不一样技术
扩展比较方便 --如果哪个服务负载比较大,就可以针对那个服务去扩展

1.3.实现微服务的架构 技术

Springboot+springCloud
Dubbo
Dubbox
SpringcloudAlibaba
这些都是服务治理的框架

2.Spring cloud概述

Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。

3. 核心组件

五大神兽:

  • 服务发现——Netflix Eureka
  • 客服端负载均衡——Netflix Ribbon/Feign
  • 服务网关——Netflix Zuul
  • 断路器——Netflix Hystrix
  • 分布式配置——Spring Cloud Config

4.Spring Cloud入门程序

  • 1)搭建环境 : 以maven多模块化的方法搭建
  • 2)注册中心
  • 3)服务提供者
  • 4)服务消费者

4.1. 搭建环境

Idea创建springboot项目
普通maven项目 spingcloud_parent

pom.xml 限定springboot版本 , 限定springcloud版本

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<java.version>1.8</java.version>
	<spring-cloud.version>Finchley.SR1</spring-cloud.version>
	<springboot.version>2.0.5.RELEASE</springboot.version>
</properties>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>${spring-cloud.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>${springboot.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

5.Eureka注册中心

原理:
在这里插入图片描述

三大角色:
Eureka server : 提供服务注册和发现
Eureka Server提供服务注册服务。各个服务提供者节点启动后,会在Eureka Server中进行注册,这样Eureka server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
Service Provider : 服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到。
Service Consumer : 服务消费方从Eureka获取注册服务列表,从而能够消费服务。
Eureka client是一个java客户端,用于简化eureka server的交互,在应用启动后,将会向Eureka Server发送心跳。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表把这个服务节点移除。

单机注册中心搭建

创建一个普通maven项目

pom.xml

<!--springboot支持-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!--Eureka服务端支持-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

yum配置

server:
  port: 7001
eureka:
  instance:
    hostname: localhost
  client:
      registerWithEureka: false #是否要注册到eureka
      fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
  defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置

注意层次位置

主类(启动类)

@SpringBootApplication
@EnableEurekaServer//标识是eureka服务端
public class EnrekaServerApplication_7001 {
public static void main(String[] args) {
        SpringApplication.run(EnrekaServerApplication_7001.class);
    }
}

启动并测试:

启动入库类访问localhost:7001

6.服务提供者

6.1.项目结构分析

user_interface(接口)/façade(门面) -> 公共代码
domain,query,接口,util

user_provider_8001 : 服务提供者
public User getUser

user_consumer_9001:服务消费者
User user = 调用代码

6.2 代码实现

1)创建项目
(1)创建一个 模块 User_interface 放到哪里 以后放公共代码 创建一个Domain – User
(2)创建一个 服务提供者模块 User_provider_8001
2) 依赖

<dependencies>
	<!--公共代码依赖-->
	<dependency>
		<groupId>cn.wing.springcloud</groupId>
		<artifactId>User_interface</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
	
	<!--springboot支持-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
	</dependency>
	
	<!--eureka客户端支持 -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>
</dependencies>

3)Provider做配置

erver:
  port: 8001
spring:
  application:
     name: USER-PROVIDER #不要使用下划线
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿

4)入口

@SpringBootApplication
@EnableEurekaClient //表示是eureka的客户端
public class UserProviderApplication_8001 {
public static void main(String[] args) {
        SpringApplication.run(UserProviderApplication_8001.class);
    }
}

5)Controller

@RestController
@RequestMapping("/provider")
public class UserController {

//    @Autowired
   //    private IUserService userService;
@RequestMapping("/user/{id}") //user/1
public User getUser(@PathVariable("id") Long id) {

// 正常应该调用service获取用户,现在模拟一下
return new User(id, "zs");
    }
}

启动服务测试:
http://localhost:8001/provider/user/1
返回json数据 正常

7.服务消费者-基础

1)创建Maven模块项目 User_consumer_9001
2)依赖jar

<!--公共代码依赖-->
<dependency>
	<groupId>cn.wing.springcloud</groupId>
	<artifactId>User_interface</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>

<!--springboot支持-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
</dependency>

3)配置yml

server:
  port: 9001
spring:
  application:
    name: USER_CONSUMER

4)入口类

package cn.wing.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

5)测试
调用服务提供者的接口

@Configuration // <beans></beans>
public class CfgBean {

@Bean //<bean class="org.springframework.web.client.RestTemplate"></bean>
public RestTemplate getRestTemplate(){
return new RestTemplate();
    }
}
@RestController
@RequestMapping("/consumer")
public class UserController {

//多个方法调用只需改一处就ok
public static  final String URL_PREFIX = "http://localhost:8001";

@Autowired
private RestTemplate restTemplate;

@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id")Long id){
//调用远程服务 http请求
String url = URL_PREFIX+"/provider/user/"+id;
return restTemplate.getForObject(url,User.class );
    }
}

测试:
http://localhost:9001/consumer/user/2
返回json

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值