springCloudNetFlix
导入依赖= =》编写配置= =》开启服务
图解及Git
springCloud五大组件
eureka:注册中心
ribbon: 负载均衡
hystrix:服务熔断及降级及监控
zuul:路由
config:分布式管理
1.springCloud-Api
导入实体类
2.注册中心eureka7001
a.导入依赖
<!-- 注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
b.配置
server:
port: 7001
#Eureka配置
eureka:
instance:
hostname: eureka7001.com #Eureka服务端的实例名称
client:
register-with-eureka: false # 表示是否向eureka注册中心注册自己
fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
service-url:
# 单机
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群(关联):
defaultZone: http://eureka7002.com:7002/eureka/
c.开启服务
//注册中心! 启动之后访问localhost:7001
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
3.Ribbon负载均衡80(在消费者处配置)
a.导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 这里是配置eureka服务端的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>com.xu</groupId>
<artifactId>springCloud-Api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
b.编写配置:
server:
port: 80
eureka:
client:
register-with-eureka: false # 不向eureka注册自己
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
c.开启服务:
@SpringBootApplication
@EnableEurekaClient
//注入负载均衡的配置类,实现负载均衡算法,name=服务id configuration=配置类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = xuRule.class)
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}
d.实现RestTemplate
@Configuration
public class ConfigBean {
//配置负载均衡实现RestTemplate
@Bean
@LoadBalanced //Ribbon 开启负载均衡的注解
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
e.controller层注入RestTemplate
原理是通过提供服务者的服务名来访问,restful风格访问
/**
* 消费部门
*/
@RestController
public class DeptConsumerController {
@Autowired
RestTemplate restTemplate;
//这里的REST_URL_PREFIX设置为服务提供者的id,方便消费者从注册中心调用
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
@PostMapping("/consumer/add")
public Boolean add(Dept dept){
//(REST_URL_PREFIX+"/Dept/add",通过服务者的id拼接请求路径访问
return restTemplate.postForObject(REST_URL_PREFIX+"/Dept/add",dept,Boolean.class);
}
@GetMapping("/consumer/get/{id}")
public Dept get(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"/Dept/get/"+id,Dept.class);
}
@GetMapping("/consumer/list")
public List<Dept> list(){
return restTemplate.getForObject(REST_URL_PREFIX+"/Dept/list",List.class);
}
}
f.负载均衡算法
必须在主启动类的上一级配置,不能被springboot扫到;需要手动到主启动类上配置服务id和配置类类名
@Configuration
public class xuRule {
// IRule
// RoundRobinRule 轮询
// RandomRule 随机
// AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~
// RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
@Bean
public IRule getRule(){
return new RandomRule();
}
}
4.Hystrix服务熔断8001(在提供服务处配置)
a.导入依赖
<!-- 服务熔断服务降级-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- eurake服务提供方-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--actuator完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--我们需要拿到实体类所以要配置api module-->
<dependency>
<groupId>com.xu</groupId>
<artifactId>springCloud-Api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- 热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
b.编写配置
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.xu.springcloud.entity
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring的配置 服务提供者的名称
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8
username: root
password: root
#Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
instance:
instance-id: springcloud-provider-dept8001 # 修改eureka上的默认描述信息!
prefer-ip-address: true # true,可以显示服务的IP地址 ~
#info配置
info:
app.name: XJPSpringCloud-springcloud
company.name: fateba.top
c.开启服务
@SpringBootApplication
@MapperScan("com.xu.springcloud.dao")
@EnableDiscoveryClient //服务的注册与发现
@EnableCircuitBreaker//添加对熔断的支持
public class DeptProvider_Hystrix_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_Hystrix_8001.class,args);
}
d.controller实现对服务的熔断及提醒
//服务熔断 fallbackMethod =新的方法名
@HystrixCommand(fallbackMethod = "hystrixGet")
@GetMapping("/get/{id}")
public Dept get(@PathVariable("id") Long id){
Dept dept = iDeptService.queryById(id);
//当dept==null时 会熔断当前服务,执行hystrixGet()方法
if (dept==null){
throw new RuntimeException("报错");
}
return dept;
}
public Dept hystrixGet(@PathVariable("id") Long id){
Dept dept = new Dept();
dept.setDeptno(id);
dept.setDname("阿崔提醒您-->您本次输入的部门号不存在");
dept.setDbSource("您好!我是阿崔!-->没有这个数据库");
return dept;
//====================================================================================== //======================================================================================
//这个注解是为了获取微服务列表的清单,方便团队开发
@Autowired
DiscoveryClient client;
/**
*获取微服务列表的清单,方便团队开发
*/
@GetMapping("/discovery")
public Object discovery(){
//获取微服务列表的清单
List<String> services = client.getServices();
//得到一个具体的微服务信息,通过具体的微服务id,applicaioinName;
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
System.out.println("discovery=>services:"+services);
for (ServiceInstance instance : instances) {
System.out.println(
instance.getHost()+"\t"+
instance.getPort()+"\t"+
instance.getUri()+"\t"+
instance.getServiceId()
);
}
return this.client;
}
5.Hystrix Dashdoard服务监控9001
使用服务器监控的前提:所有提供服务者必须加入该监控依赖以及启动类上加入一个select
<!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
/** * 配置对服务的监控 这个配置是固定的 * @return */ //增加一个 Servlet @Bean public ServletRegistrationBean hystrixMetricsStreamServlet(){ ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet()); registrationBean.addUrlMappings("/actuator/hystrix.stream"); return registrationBean; }
a.导入依赖
<!-- 服务的监控-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 这里是配置eureka服务端的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>com.xu</groupId>
<artifactId>springCloud-Api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
b.编写配置
server:
port: 9001
c.开启服务
@SpringBootApplication
//HystrixDashboard监控注解
@EnableHystrixDashboard
public class HystrixConsumer_9001 {
public static void main(String[] args) {
SpringApplication.run(HystrixConsumer_9001.class,args);
}
}
d.访问
http://localhost:9001/hystrix <!--访问监控页面-->
<!--在监控页面决定监控8001服务-->
http://localhost:8001/actuator/hystrix.stream
6.Zuul路由9527
a.导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 服务的监控-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 这里是配置eureka服务端的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>com.xu</groupId>
<artifactId>springCloud-Api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
b.编写配置
server:
port: 9527
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: wstcxjp.com # 服务端的id
prefer-ip-address: true # 是否显示ip
spring:
application:
name: springcloud-zuul-dept
info:
app.name: xu-springcloud
company.name: fateba.top
zuul:
host:
connect-timeout-millis: 3000
socket-timeout-millis: 3000
routes: # 相当于代理服务名为springcloud-provider-dept的服务者
mydept.serviceId: springcloud-provider-dept # 原服务名
mydept.path: /mydept/** # 新的替换过后的虚拟服务名,用于请求
ignored-services: "*" # 不能再使用这个路径访问了,ignored : 忽略,隐藏全部的~
# prefix: /kuang # 设置公共的前缀
# 添加ribbon的超时时间设置
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
# 配置zuul
hystrix:
command:
default:
execution:
isolation:
thread:
timeout-in-milliseconds: 3000
c.开启服务
@SpringBootApplication
//路由配置
@EnableZuulProxy
public class zuul9527 {
public static void main(String[] args) {
SpringApplication.run(zuul9527.class,args);
}
}
d.访问
<!--/mydept是代理的服务名,/Dept/get/1是提供服务方的restful请求路径-->
localhost:9527/mydept/Dept/get/1
<!--也可以把localhost换成网址-->