继续Nacos!
使用nacos,nacos是先读取在他页面上配置的yaml文件,再读取我们springboot里面的yml文件进行合并。但是先读区yaml文件要知道他在哪。所以这时候要有一个bootstarp.yml
注:当然在yml文件中有些重复的配置就可以不要了。
热部署
环境共享配置
四、Feign
1导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2.feign客户端
@FeignClient("user-service")
public interface UserFeignApi {
@GetMapping("/user/{id}")
public User findById(@PathVariable("id") String username);
}
3开启feign功能
@EnableFeignClients(basePackages="com.itheima.sh.clients") // 开启Feign功能
feign性能优化:
(1)定义日志级别日志:NONE、BASIC、HEADERS、FULL
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
要是想性能优化好一点,一般使用NONE、BASIC
(2)使用别的底层client,用httpClient、okClient
五、GateWay网关
网关的功能特性:请求路由、权限控制、限流、集成Hystrix断路器
网关的每一个功能都是由过滤链完成的。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
server:
port: 10010 #服务端口
spring:
application:
name: gateway-server #指定服务名
cloud:
gateway:
routes:
- id: user-service # 当前路由的唯一标识
uri: lb://user-service # 路由的目标微服务,lb:代表负载均衡,user-service:代表服务id
predicates: # 断言
- Path=/user/** # 按照路径匹配的规则
lb:负载均衡的协议,将来会使用Ribbon实现负载均衡
网关跨域问题(CORS)
六、Hystrix熔断器
微服务中,微服务调用关系错综复杂,要是其中一个服务崩溃了,那么好多服务也会随着崩溃无法启动。
产生雪崩效应的场景:流量激增、缓存刷新、程序有bug、数据库严重瓶颈、线程同步等待
解决方案:
超时机制:给每个请求设置超时;
断路器模式:要是依赖的服务有大量超时时,再让新的请求去访问就没有意义了。这边就应该使用断路器避免资源浪费。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@EnableCircuitBreaker/@SpringCloudApplication(综合注解)
@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryByIdFallBack")
public User queryById(@PathVariable("id") String id){
User user = restTemplate.getForObject("http://user-service/user/"+id, User.class);
return user;
}
// 降级方法
public User queryByIdFallBack(String id) {
User user = new User();
user.setName("暂停服务");
return user;
}
feign与hystrix的结合
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
//UserFeignApiFallBack
@Component
public class UserFeignApiFallBack implements UserFeignApi {
@Override
public User findById(String username) {
User user = new User();
user.setName(username);
user.setNickName("UserFeignApiFallBack");
return user;
}
}
//UserFeignClient
@FeignClient(value = "user-service",fallback = UserFeignApiFallBack.class)
public interface UserFeignApi {
@GetMapping("/user/{id}")
public User findById(@PathVariable("id") String username);