什么是微服务
微服务就是不同的模块部署在不同的服务器上面,通过接口去访问就是微服务
作用:利用分布式解决网站高并发带来的问题
什么是集群
多台服务器部署相同应用构成一个集群
作用:通过负载均衡设备共同对外提供服务
什么是RPC?
RPC是一种面向接口的远程调用形式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决
有哪些微服务远程调用框架:WebService,dubbo,SpringCloud
Restful,Soap,rpc
Restful:是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 Restful架构或服务。主要是JSON实现(可以简单的理解restful就是Json)
Soap:了解过WebService的同学可能了解过soap,他是一种数据交换规范,是基于XML协议的一种简单的、轻量级的规范。请求包格式为Xml。
SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。
soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。
Rpc:RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
SOA和微服务的区别
SOA:面向服务(暴露接口),业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力。通过服务的组合和编排来实现上层的业务流程。是一种面向服务的架构理念
微服务:是SOA的升华版本,多模块之间采用RPC远程调用技术。架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行。
SpringCloud
SpringCloud为我们开发人员提供了快速构建分布式的一套工具,包括配置管理,服务发现(Eureka注册中心),服务消费(ribbon和Feign),路由(负载均衡),断路器。。。。一套完整的分布式微服务的治理框架。SpringCloud完全使用SpringBoot构建项目。
服务提供者+消费者
服务提供者:就是提供服务被别人调用
消费者:调用别人暴露出来的接口
(举例生产者和消费者关系)
SpringCloud注册中心(Eureka)
注册中心的作用就是用来方便接口暴露出来的一个管理工具,如果所有的接口只是暴露出来,没有一个统一的管理工具,又有谁知道你暴露了那些接口了,其他的开发人员怎么知道我们暴露了哪些接口出来呢。eureka是一个SpringCloud的服务注册和发现模块。
这里我们首先去搭建我们的注册中心项目。
创建EurekaServer项目
采用Maven Project
第一步:创建一个空的Maven项目springcloud,然后在springcloud项目创建新的Module-springboot项目,方便管理微服务。
第二步: 创建注册中心
- 选择依赖:
结果:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.entor</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
</dependencies>
</dependencyManagement>
接下来启动注册中心就可以了
@SpringBootApplication
@EnableEurekaServer//开启注册中心
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动成功
创建EurekaProvider项目
服务提供者就是提供一个服务暴露出来给别人调用,在SpringCloud中我们需要注册服务到我们的注册中心。
第一步: 在springcloud项目下创建一个新的Module,springboot项目
第二步: 引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.entor</groupId>
<artifactId>eureka-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
</dependencies>
</dependencyManagement>
第三步: 服务提供者的配置文件
server:
port: 9101
spring:
application:
#应用名称,区分不同的应用
name: eureka-provider
eureka:
client:
service-url:
#服务注册的地址,eureka注册中心的地址
defaultZone: http://localhost:9001/eureka
#每隔5秒去注册中心拉取服务列表信息到本地
registry-fetch-interval-seconds: 5
instance:
#服务重新续约持续的时间(该服务每隔5(默认30秒)秒向注册中心发生心跳,表明该服务还能够正常连接还能够提供服务)
lease-renewal-interval-in-seconds: 5
#注册中心每隔15秒向服务发生心跳,检测服务是否正常
lease-expiration-duration-in-seconds: 15
#注册中心显示服务的ip地址,默认是显示计算机名称
prefer-ip-address: true
#注册中心显示的服务实例名称
instance-id: ${spring.application.name}-${spring.port}
第四步: 服务提供者对外提供的接口(控制层)
@RestController
public class HelloController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "hello")
public String hello(String name){
return "当前端口号:"+port+",hello "+name;
}
}
第五步: 开启注册中心客户端
@SpringBootApplication
@EnableEurekaClient
public class EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
接下来启动两次该服务提供者
消费者创建
消费者其实和服务提供者是一个性质,都是可以提供服务和进行消费的。本次分开主要是体现一个服务调用另一个服务接口的方式。
在微服务分布式中,业务都会被拆分成一个独立的服务,并且在多个服务器上部署相同的服务。服务与服务的通讯是基于http restful的。SpringCloud我们会使用到两种消费工具,Ribbon+Feign。
Ribbon实现了服务的负载均衡
Feign默认集成了Ribbon。
所以一般情况下我们使用Feign作为消费端,本次使用Ribbon。
我们这里去启动两个服务提供者,将提供者端口9101和9102分别启动,可以在9001 Eureka服务查看到两个服务,方便我们看到Ribbon实现负载均衡
第一步: 在springboot的下创建Module-springboot
第二步: 引入依赖
结果
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.entor</groupId>
<artifactId>eureka-customer-ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-customer-ribbon</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!-- 手动添加的断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
</dependencies>
</dependencyManagement>
第三步: 消费者配置文件
与服务提供者配置方式一样
server:
port: 9201
spring:
application:
name: eureka-customer-ribbon
eureka:
client:
service-url:
defaultZone: http://localhost:9001/eureka
registry-fetch-interval-seconds: 5
instance:
prefer-ip-address: true
instance-id: eureka-customer-ribbon-9201
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 15
第四步:创建消费者接口(控制层)
@RestController
public class HelloController {
@Autowired
private HelloService helloServicel;
@RequestMapping("/hello")
//断路器,如果访问的服务器发生异常,则调用断路器指定的回调方法
@HystrixCommand(fallbackMethod = "helloError")//需要添加断路器依赖
public String hello(String name) {
return helloServicel.hello(name);
}
public String helloError(String name){
return "您好:"+name+"服务器异常";
}
}
@SpringBootApplication
@EnablediscoveryClient//服务发现客户端(调用服务需要这个)
@EnableHystrix//开启断路器
public class EurekaCustomerRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaCustomerRibbonApplication.class, args);
}
@Bean
@LoadBalanced//装配RestTemplate类开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
服务层
@Service
public class HelloServiceImpl implements HelloService {
@Autowired
private RestTemplate restTemplate;
@Override
public String hello(String name) {
// 使用restTemplate工具类,restful方式调用接口
// eureka-provider是服务在注册中心的名称
// 该名称下可以有多台服务器实例,实现负载均衡访问
return restTemplate.getForObject("http://eureka-provider/hello?name=" + name, String.class);
}
}
启动该类就可以调用服务着的接口,并且Ribbon还能帮我们实现负载均衡。
接口调用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。