服务搭建
springboot 2.1.6对应的springcloud为Greenwich.SR2
(G版本)
版本不兼容搞死我了
启动eureka只需三部
1.依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.配置
server.port=7003
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
3.主配置类上加上@EnableEurekaServer
----------------------结束666666--------------------
提供者端的别名处理和ip提示
#别名处理
eureka.instance.instance-id=cloud-user8001
#显示ip地址
eureka.instance.prefer-ip-address=true
2服务端添加:info.app-name=xc
结果:
Eureka自我保护机制:
在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式。
集群配置
高可用
在创建两个模块7003_1,7003_2
选中如下配置
也就是eureka服务端
依赖文件
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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>
在三个主启动类上面都标注@EnableEurekaServer
修改映射:C:\Windows\System32\drivers\etc路径下的hosts文件
127.0.0.1 eu7001.com
127.0.0.1 eu7002.com
127.0.0.1 eu7003.com
配置三台配置文件
#7001端口
server.port=7001
eureka.instance.hostname=eu7001.com
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://eu7002.com:7002/eureka/,http://eu7003.com:7003/eureka/
#7002端口
server.port=7002
eureka.instance.hostname=eu7002.com
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://eu7001.com:7001/eureka/,http://eu7003.com:7003/eureka/
#7003端口
server.port=7003
eureka.instance.hostname=eu7003.com
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://eu7002.com:7002/eureka/,http://eu7001.com:7001/eureka/
服务提供者端配置--同时注册三台机器上
#8001的服务提供者要入住到eureka---交互和eureka的配置一样
eureka.client.serviceUrl.defaultZone=http://eu7002.com:7002/eureka/,
http://eu7003.com:7003/eureka/,http://eu7001.com:7001/eureka/
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。
配置ribbon(消费者端)
1.依赖pom
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.配置文件:
eureka.client.serviceUrl.defaultZone=http://eu7002.com:7002/eureka/,
http://eu7003.com:7003/eureka/,http://eu7001.com:7001/eureka/
eureka.client.register-with-eureka=false
3.客户端类启用
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced//启用负载均衡 客户端
public RestTemplate getRestemplete(){
return new RestTemplate();
}
}
4.消费端主启动类配置@EnableEurekaClient
5.修改客户端访问类controller
6.访问客户端的
负载均衡demo:
1三分一样的服务提供者,因为每一个 为服务都有自己的数据库,所以建立三个库
2配置文件只需要修改端口和数据库和实例别名(为了好区分)
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://192.168.209.131:3306/test3?serverTimezone=GMT
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.maxActive=20
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mappers/*.xml
server.port=8003
#对外暴露的为服务名字
spring.application.name=cloud-config
#8001的服务提供者要入住到eureka---交互和eureka的配置一样
eureka.client.serviceUrl.defaultZone=http://eu7002.com:7002/eureka/,http://eu7003.com:7003/eureka/,http://eu7001.com:7001/eureka/
#别名处理
eureka.instance.instance-id=cloud-user8003
#显示ip地址
eureka.instance.prefer-ip-address=true
info.app-name=xc
3测试启动eureka集群,启动服务提供者,启动消费者。刷新出现默认使用轮询算法
自定义负载策略,启动消费者 ,随机算法
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate getTemplate(){
return new RestTemplate();
}
@Bean
public IRule myRule(){//这里是修改默认的负载策略
// 用随机算法代替默认的轮询算法
return new RandomRule();
// 重试算法
// return new RetryRule();//加入有个服务宕机,指挥访问三次,之后就不会访问宕机的服务了
}
}
自定义ribbon
1主启动类添加@RibbonClient
2这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,
否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说
我们达不到特殊化定制的目的了。
3demo:
--------------------------------
feign面向接口调用微服务,Feign自带负载均衡配置项
feign继承了ribbon,使用轮询方式,实现负载均衡只需要声明接口就可以 (面向接口编程)
1在消费者端添加feign的支持依赖
1.添加pom依赖
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.修改api工程 <!--接口中也要添加feign的支持依赖-->
接口层
public interface FeignTicketSerivce {
@RequestMapping(value = "/ticket",method = RequestMethod.GET)
public String getTicket();
}
消费者端
1)接口
@FeignClient(value = "FEIGN-PROVIDER",fallback =DemoServiceFallback.class )
public interface FeignTicketSerivceDemo extends FeignTicketSerivce{
}
2)controller
@RestController
public class FeignController {
@Autowired
private FeignTicketSerivceDemo demo;
@RequestMapping("/ticket")
public String getTicket(){
return demo.getTicket();
}
}
服务端 controller
@RestController
public class FeignController {
/**
* 这里是关键代码
* url 和消费端接口的url相等,所以消费端controller和接口的url也相等
* 所以这里三个url是相等的
* 这段代码注释后,服务就无法调用
*/
@Autowired
private TicketSerivce ticketSerivce;
@RequestMapping("/ticket")
public String getTicket(){
return "狂神传";
}
}
3.消费者端启动类添加注解 @EnableFeignClients
Hystrix断路器链接
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
服务熔断
1.依赖pom
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.主配置几乎不变
修改一下别名
#别名处理
eureka.instance.instance-id=cloud-user8003-hystrix
3.再调用方法上标注@HystrixCommand(fallbackMethod = "aa")的注解,意思是代码正确,正常返回,除了异常,执行fallbackMethod的processHystrix_Get方法,返回一个符合预期的、可处理的备选响应(FallBack)
@Autowired
private UserService userService;
@RequestMapping(value = "/users/get/{id}")
@HystrixCommand(fallbackMethod ="aa")
public Users getUser(@PathVariable("id") int id){
System.out.println("id,,,,,,,"+id);
return userService.getUser(id);
}
public Users aa(@PathVariable("id") int id){
return new Users(id,"no uses","no addr");
}
4.在消费者端的主启动类标注@EnableCircuitBreaker//对hystrix的支持
服务降级
服务降级处理是在客户端实现完成的,与服务端没有关系。
服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级,以此环节服务器的压力,以保证核心任务的进行。
1接口修改
@FeignClient(value = "CLOUD-CONFIG",fallbackFactory = UserServiceFallBack.class)
public interface UserService {
@RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
public Users getUser(@PathVariable("id") Integer id);
}
2实现FallbackFactory
@Component//注意这个一定要添加
public class UserServiceFallBack implements FallbackFactory<UserService>{
@Override
public UserService create(Throwable throwable) {
return new UserService() {
@Override
public Users getUser(Integer id) {
return new Users(id,"aa","ac");//友好提示
}
};
}
}
3消费者端配置中
feign.hystrix.enabled=true
4测试
关闭服务提供者,可以出现我们自定义的友好提示
(3)服务监控
Spring Cloud提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。
1.新建模块dashboard,在消费者端添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
2.消费者主启动类添加注解@EnableHystrixDashboard
3.端口配置: server.port=9001
4.所有的服务提供者都要添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
5.启动访问http://localhost:9001/hystrix
----------------------------------------------------------------------------------------------------------------------------------
网关zuul:路由和过滤
配置:
1.依赖pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.配置
server.port=9527
#对外暴露的为服务名字
spring.application.name=cloud-zuul
#8001的服务提供者要入住到eureka---交互和eureka的配置一样
eureka.client.serviceUrl.defaultZone=http://eu7002.com:7002/eureka/,http://eu7003.com:7003/eureka/,http://eu7001.com:7001/eureka/
#别名处理
eureka.instance.instance-id=cloud-user9527-zuul
#显示ip地址
eureka.instance.prefer-ip-address=true
info.app-name=xc
3.映射
127.0.0.1 zuulxc.com
4.启动类@EnableZuulProxy
之前服务访问 http://localhost:8001/get/1
通过网关访问 (微服务名小写)
修改为服务映射规则:
zuul.ignored-services=cloud-config//忽略当前微服务调用 *忽略所有
zuul.routes.user.serviceId=cloud-config//为服务映射
zuul.routes.user.path=/user/**
zuul.prefix=/ssm //前缀配置通过访问:
-------------------------------------------------------------------------------------------------------------------------------------------
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
步骤
用自己的GitHub账号在GitHub上新建一个名为microservicecloud-config
的新Repository
依赖pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>