标签:接口 指定 run ota client wired sel new 根据
架构演变
远程服务调用方式
Eureka
Ribbon
## 架构演变(了解)
集中式
特点:所有功能代码都在一个项目中
应用场景:访问量不太大的小项目
优点:开发、部署比较简单方便
缺点:修改代码,需要对整个项目进行打包部署,相对比较麻烦
垂直拆分
特点:根据功能把项目拆分成一个个单独的系统,系统之间不进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(中型项目)
优点:相对于集中来说,承载的访问量跟多;系统间相互独立可以采用不同的开发语言。
缺点:代码冗余、代码复用性比较低
分布式
特点:根据功能把项目拆分成一个个单独的系统,系统之间进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(大中型项目)
优点:相对于集中来说,承载的访问量跟多;系统间相互独立可以采用不同的开发语言;代码冗余度降低;
缺点:服务间调用关系比较杂乱
SOA
特点:根据功能把项目拆分成一个个单独的系统,系统之间进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(大型项目)
优点:相对于集中来说,承载的访问量跟多;系统间相互独立可以采用不同的开发语言;代码冗余度降低;有服务治理工 具,服务间调用关系比较清晰
缺点:一个系统对外提供多种服务,调用不清晰
微服务
特点:根据功能把项目拆分成一个个单独的系统,每个系统提供单一服务,系统之间进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(特大项目)
优点:相对于集中来说,承载的访问量更多;系统间相互独立可以采用不同的开发语言;代码冗余度降低;有服务治理工 具,服务间调用关系比较清晰;一个系统对外提供一种服务;耦合度低。
缺点:系统太多,占用服务器比较多,调用关系比较复杂,部署比较麻烦
总结:分布式、SOA、微服务都是“分布式架构”。
## 服务远程调用方式
webservice远程服务调用(了解)
cxf、axis:基于soap
hessian:基于hessian协议
dubbo(dubbox) Fegin:dubbo RPC协议,Feign http协议
RestTemplate
```tex
spring内置Http请求对象,可以在项目中直接使用@Autowired注入使用,也可以切换底层实现:
HttpClient
OkHttp
JDK原生的URLConnection(默认的)
概念:基于springBoot的,微服务框架集大成者
所有springCloud工程(直接、间接)都要导入如下坐标:
<!--继承springBoot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!--springCloud版本管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
概念:SpringCloud核心组件,默认的注册中心(Consul、Nacos)
作用:注册中心,服务注册、发现(注意:既不提供服也不消费服务)
角色:Eureka服务端(注册中心)、Eureka客户端(服务提供者、服务消费者)
搭建步骤:
1)导入起步依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2)配置(配置文件、配置类)
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
# eureka 服务地址:
#单机版:指定自己地址接口
#集群版:需要指定其它集群eureka地址,有几个写几个,以逗号分隔即可
defaultZone: http://127.0.0.1:10086/eureka
# 默认true:单机版,不注册自己false;集群版,注册自己,使用默认值true即可
register-with-eureka: false
# 默认true:单机版,不拉取服务false;集群版,拉取服务,使用默认值true即可
fetch-registry: false
server:
# 服务失效剔除时间间隔,默认60秒
eviction-interval-timer-in-ms: 60000
# 关闭自我保护模式(默认是打开的)
enable-self-preservation: false
3)代码
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer//声明当前应用为Eureka服务端(注册中心)
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
注意:如果依照上述操作出现Eureka-Server启动后自动停止,导入如下依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1)导入起步依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2)配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #注册中心地址,如果集群,有几个写几个,逗号分隔
instance:
# 更倾向使用ip地址,而不是host名
prefer-ip-address: true
# ip地址
ip-address: 127.0.0.1 #默认0.0.0.0.0.0.1
# 续约间隔,默认30秒
lease-renewal-interval-in-seconds: 5
# 服务失效时间,默认90秒
lease-expiration-duration-in-seconds: 5
3)代码
package com.itheima.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.itheima.user.mapper")
//@EnableDiscoveryClient //开启Eureka、zookeeper、consul客户端发现功能
@EnableEurekaClient //声明当前工程为Eureka Client,开启Eureka客户端发现功能
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
概念:基于Go语言,多数据中心、高可用、分布式注册中心
作用:服务注册、服务发现
准备工作:搭建consul注册中心
1)导入起步依赖
<!--consul 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2)配置
#配置consul注册中心地址
server:
port: 8000
spring:
cloud:
consul:
host: localhost # consul 服务端的 ip
port: 8500 # consul 服务端的端口 默认8500
discovery:
service-name: ${spring.application.name} # 当前应用注册到consul的名称
prefer-ip-address: true # 注册ip
application:
name: consul-provider # 应用名称
3)代码
//在引导类添consul服务注册发现注解@EnableDiscoveryClient
@EnableDiscoveryClient(老师给的代码没加此注解,可以不加,都建议加上)
@SpringBootApplication
public class ConsulApplicatioin{
public static void main(String[] args) {
SpringApplication.run(ConsulApplicatioin.class, args);
}
}
概念:阿里开源的高可用、高性能注册中心和配置中心;
? Nacos = Spring Cloud注册中心 + Spring Cloud配置中心
作用:服务注册、发现;集中管理配置。
准备工作:搭建nacos注册中心
1)导入起步依赖
<!--nacos-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2)配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置nacos 服务端地址
application:
name: nacos-provider # 服务名称
3)代码
//在引导类添Nacos服务注册发现注解@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class NacosApplicatioin{
public static void main(String[] args) {
SpringApplication.run(NacosApplicatioin.class, args);
}
}
概念:SpringCloud组件,负载均衡器
作用:负载均衡
负载均衡分类:服务端、客户端负载均衡。区分依据,服务地址列表在服务端还是在客户端 举例:服务端负载均衡nginx;客户端负载均衡ribbon。
负载均衡:在集群中,根据服务器性能不同,分配对应的负载(请求数) 例: User-Service 1000请求 A 8G User-Service 250 1 B 8G User-Service 250 1 C 16G User-Service 500 2
负载均衡算法:轮询(默认)、随机、加权、hash
策略(底层在IRule接口中找实现类)
使用步骤:
1)导包
<!--Ribbon依赖包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--‘eureka-client‘、‘openfeign‘内置了ribbon依赖包-->
2)配置
#ribbon相关配置,没有特殊要求可以省略,使用默认值即可
3)代码
@LoadBalanced //添加到执行远程调用的Http客户上
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
源码跟踪(能断点查看即可)
1)LoadBalancerInterceptor拦截请求,根据请求URI获取serviceID(源码大概:第31行)
2)RibbonLoadBalancerClient执行请求时,根据serviceID从Eureka注册中心获取服务列表,使用负载均衡算法从服务列表中,获取一个服务地址,发送请求(源码大概:第64行)
概念:mybatis一个插件,对单表SQL进行了封装
作用:提供了对单表的CRUD操作
使用步骤:
1)导入起步依赖
<!--通用Mapper起步依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!--实体类和表做映射需要使用:@Table(name = "tb_user")、@Id-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
2)配置
#使用默认配置即可,可以省略
3)代码
实体类
package com.itheima.user.pojo;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Data
@Table(name = "tb_user")
public class User{
// id
@Id
//开启主键自动回填
@KeySql(useGeneratedKeys = true)
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
// 备注
private String note;
}
接口
public interface UserMapper extends Mapper<User>{}
引导类
package com.itheima.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.itheima.user.mapper") //该注解来自tkMapper,导包时要注意
@EnableDiscoveryClient //开启Eureka客户端发现功能
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
概念
是一种快速使用spring的方式
核心
自动装配:约定大于配置,有默认配置。简化配置文件书写
起步依赖:基于maven依赖传递实现。简化依赖包管理
优点
1)自动装配,简化配置文件书写
2)起步依赖,简化依赖包管理
3)非功能性增强:监控、日志...
4)嵌入式服务器,项目启动更加方便
使用步骤
1)导包
<!--继承springBoot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
2)配置
#springboot配置:配置文件(.properties、yml)、配置类(@Configuration)
#application.yml
spring:
application:
name: springboot-project
server:
port: 8080
3)代码
//引导类
@SpringbootApplication
public class XxxxApplication{
public static void main(String[] args){
SpringApplication.run(XxxxApplication.class,args);
}
}
1)所有远程交互所使用的的pojo都要实现序列化接口(Serializable)
2)实体类书写规范
1.如果有有有参构造,一定要声明无参构造(反射要用无参构造)
2.见名知意(包名、类名、属性名、方法名)
标签:接口 指定 run ota client wired sel new 根据
原文地址:https://www.cnblogs.com/zhang-blog/p/14100577.html