*三种微服务技术
*springcloud和springboot的版本对应
一、RestTemplate + Eureka + Nacos
1.注入RestTemplate
通过bean注入到spring容器中,在要用的时候装配出来使用
String url = "http://localhost:8081/user/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class);
发送get请求获取接口数据
getForObject(url, User.class)
第一个参数是请求地址,第二个参数可以设置返回的类型,自动讲json转换成对象
2.Eureka注册中心
微服务启动时自动向Eureka注册自己的信息
消费者需要接口时向Eureka拿信息
没30s服务都会向Eureka发送心跳,告诉Eureka还活着,防止单机
搭建eureka服务
①导依赖
<!--eureka服务端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
②写配置文件
设置服务名
设置服务信息
server: port: 10086 #服务端口 spring: application: name: eurekaserver eureka: client: service-url: #eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka
③启动服务
eureka服务注册
①导入依赖
<!--eureka客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
②配置信息
配置服务名
配置服务信息
spring: application: name: eurekaserver eureka: client: service-url: #eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka
配置多个实例
可以复制服务的配置,来创建多个服务,但是需要添加参数 -Dserver.port=8082 来设置端口,防止端口冲突
3.Eureka服务发现-拉取服务
1.用服务名代替ip端口
old: String url = "http://localhost:8081/user/" + order.getUserId(); new String url = "http://userservice/user/" + order.getUserId();
2.配置负载均衡
在RestTemplate上添加配置 @LoadBalanced
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
负载均衡
由Ribbon完成负载均衡
当发送请求时,ribbon拦截请求,并向eureka拉去服务列表,在根据列表做负载均衡
ribbon原理:
底层负载均衡的逻辑定义在IRule中,由IRule的子类决定是什么子类
想要修改默认的规则,两种方式:
第一种,只需要往容器中注入一个IRule的bean就可以修改默认的规则
例如修改规则为随机
@Bean public IRule RandomRule(){ return new RandomRule(); }
第二种,则yml文件中针对服务名,指定修改其的负载均衡规则
userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
ribbon的默认流程为懒汉模式,在第一次要用服务时,才回去拉取,放到内存中,所以使得第一次请求的时间变长
可以修改其为饥饿加载,在服务启动时加载
在yml文件中加入配置
ribbon: eager-load: enabled: true # 开启饥饿加载 clients: # 指定饥饿加载的服务名称 - userservice
4.Nacos注册中心
默认端口8848
application.properties 中修改端口
启动
windows:
①进入到bin文件夹双击startup.cmd ( 不推荐 )
②用cmd窗口进入到bin文件夹
输入
startup.cmd -m standalone
linux:
在nacos/bin目录中,输入命令启动Nacos:
sh startup.sh -m standalone
依赖包
父工程:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
客户端:
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
操作步骤:
( 不用单独创建一个模块,eureka要单独创建一个模块 )
①修改依赖包
包括父工程包和子工程包
②修改配置文件的配置信息
spring: cloud: nacos: server-addr: localhost:8848 # nacos地址 discovery: cluster-name: HZ # 集群名称
可以配置集群信息,分集群管理,让拉取优先集群内部
但是需要修改负载均衡规则为NacosRule 集群内优先,在集群内随机
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
考虑到设备性能不同,可能需要某些机器承担多一点
可以设置权重,来修改访问的频率 权重值一般在0~1
环境隔离 - namespace
配置namespace
nacos中分为临时实例和非临时实例,默认 临时实例
可以在yml中添加配置,修改其为非临时实例
临时实例:
没有收到发送的呼吸之后,就当你挂了,之后会从列表中删除
非临时实例:
相比临时实例,nacos会发送请求询问其状态,没有收到呼吸之后,会一直等待,不会从列表中删除
5.Nacos实现配置管理
1 在Nacos添加配置
2 在项目中添加依赖和包
由于需要读取Nacos中的配置文件整合到项目中的配置问间中,然而又要读取了项目的配置文件才知道Nacos的信息
所以可以需要一个优先级更高的配置文件,单独存放Nacos的配置信息
热更新
方式一
需要在使用到配置文件内容的类中添加注解
@RefreshScope
@Slf4j @RestController @RequestMapping("/user") @RefreshScope public class UserController { @Autowired private UserService userService; @Value("${pattern.dateformat}") private String dateFormate; @GetMapping("/now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateFormate)); }
方式二
专门新建一个Data类
添加 @ConfigurationProperties(prefix="pattern")
让 类中的成员变量 自动绑定到配置文件中的变量
在添加 @Component 把类注册到容器中
@Data @Component @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; }
@Slf4j @RestController @RequestMapping("/user") @RefreshScope public class UserController { @Autowired private UserService userService; @Autowired private PatternProperties patternProperties; @GetMapping("/now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat())); }
会读取nacos中多个配置文件
先读取 服务名-环境名.后缀名 例如userservice-de.yaml
再读取 服务名.yaml 例如userservice.yaml
再读取 本地的配置文件
6. nacos的非临时实例配置
默认为临时实例,默认为true
spring: application: #服务名 name: userservice cloud: nacos: server-addr: localhost:8848 # nacos地址 discovery: cluster-name: SH # 集群名称 ephemeral: true #默认为true 即临时实例,改为false则设置为非临时实例
7.eureka和nacos区别