要使用spring cloud 首先要先了解 :Monolith(单体应用)架构 和 MicroService(微服务)架构
单体应用架构:所有的jar包,在整合成打成一个war 部署tomcat运行
缺点:
如果多写一个功能,在部署,编译 测试上面变得更加 难
技术选型上面不是很灵活
扩展避免麻烦 浪费很多空间
微服务架构: 把以前整个服务进行拆分成微小的服务;每个服务独立运行 独立部署 ,独立维护 --分布式
好处:
部署,编译,测试 更加简单
技术比较灵活 --每个服务都可以使用不一样技术
扩展比较方便 --如果哪个服务负载比较大,就可以针对那个服务去扩展
Springboot+springCloud
Dubbo
Dubbox
SpringcloudAlibaba
这些都是服务治理的框架
Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。
五大神兽:
Idea创建springboot项目
普通maven项目 spingcloud_parent
pom.xml 限定springboot版本 , 限定springcloud版本
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Finchley.SR1spring-cloud.version>
<springboot.version>2.0.5.RELEASEspringboot.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${springboot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
三大角色:
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
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
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
user_interface(接口)/façade(门面) -> 公共代码
domain,query,接口,util
user_provider_8001 : 服务提供者
public User getUser
user_consumer_9001:服务消费者
User user = 调用代码
1)创建项目
(1)创建一个 模块 User_interface 放到哪里 以后放公共代码 创建一个Domain – User
(2)创建一个 服务提供者模块 User_provider_8001
2) 依赖
<dependencies>
<dependency>
<groupId>cn.wing.springcloudgroupId>
<artifactId>User_interfaceartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
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数据 正常
1)创建Maven模块项目 User_consumer_9001
2)依赖jar
<dependency>
<groupId>cn.wing.springcloudgroupId>
<artifactId>User_interfaceartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
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 //
public class CfgBean {
@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