spring Cloud 环境搭建 学习笔记



spring Cloud-->
spring boot 简化xml配置,快速整合框架
spring cloud 解决一套微服务解决方案 --RPC远程调用
配置管理、注册中心eureka zk、服务发现、服务注册、断路器、路由策略、负载均衡、全局锁、客户端调用、接口网关zuul、服务管理系统


springCloud注册中心环境搭建-->euraka
rest、feign 客户端调用工具
spring Eureka服务注册中心
负载均衡使用 ribbon    负载均衡 分别有: nginx 、Lvs、HAproxy、F5、SpringCloud也实现了负载均衡
接口网关springZuul :作用是拦截请求,类似nginx。
分布式配置中心,spring config
springCloud hystrix断路器


搭建eurka-server

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!--lookup parent from repository-->
</parent>
<properties>
  <project.build.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId> 
</dependency> 
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
 
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
  <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


application.yml
eureka:instance:hostname:localhost //eureka接口名称
eureka:client:registerWithEureka:false
eureka:client:fetchRegistry:false
eureka:client:serviceUrl:defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/
server:port:8888 //eureka项目工程端口号8888
spring:application:name:service-member
 
@SpringBootApplication
@EnableEurekaServer //支持Eureka
public class EurekApp{
public static void main(String[]args){
SpringApplication.run(EurekaApp.class,args);
}
}
http://127.0.0.1:8888   启动后访问 Eureka管理界面
新建mave jar类型工程


搭建eurela 会员服务项目:sservice-member
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!--lookup parent from repository-->
</parent>
<properties>
  <project.build.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>//web组建
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>


application.yml
eureka:client:serviceUrl:defaultZone:http://loaclhost:8888/erueka/  //注册到eureka server里面 的地址
server:port:8762 //erueka member端 端口8762
spring:application:name:service-member //提供的erueka member名 用的时候如"http://service-member/getMemberAll"


@RestController //返回json格式的contraller
public class MemberController{
@RequestMapping("/getMemberAll")
public List getMemberAll(){
List list = new ArreyList();
list.add("aaaaa");
return list;
}
}


@SpringBootApplication
@EnableEurekaClient
public class MemberApp{
public static void main(String[] args){
SpringApplication.run(MemberApp.class,args);
}
}
//启动EurekApp和MemberApp 后,在localhost:8888  会显示service-member服务
//访问12.0.0.1:8762/getMemberAll   会显示aaaaa


新建订单系统:service-order
服务调用使用 rest、feign 使用httpClient技术调用
负载均衡使用 ribbon


新建订单系统:
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> 
</dependency> 
<dependency>//web组建
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency> //负载均衡
<groupId>org.springframework.boot</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>


application.yml
eureka:client:serviceUrl:defaultZone:http://loaclhost:8888/erueka/  //注册到eureka server 里面
server:port:8764 //order端 端口8764
spring:application:name:service-order //order端 提供的服务名


@Service
public class OrderMemberService{
  @Autowired
  private RestTemplate restTemplate;
  public List<String> getOrderUserAll(){
    return restTemplate.getForObject("http://service-member/getMemberAll", List.class);
  }
}


@RestController
public class OrderController{
  @Autowired
  private OrderMemberService orderMemberService;
  @RequestMapping("/getOrderUserAll")
  public List<String> getOrderUserAll(){
    Systm.out.println("订单服务开始调用会员服务");
    return orderMemberService.getOrderUserAll();
  }
}


@EnableEurekaClient
@SpringBootApplication
public class OrderApp{
public static void main(String [] args){
SpringApplication.run(OrderApp.class,args);
}
@Bean //把类rest模板注入到bean容器中去
@LoadBalanced //支持负载均衡 启动ribbon
RestTemplate restTemplate(){
return new RestTemplate();
}
}
//启动EurekApp和MemberApp、OrderApp 后,在localhost:8888  会显示service-member、service-order服务
//访问12.0.0.1:8764/getOrderUserAll   会显示aaaaa,因为调用了member端的getMemberAll


负载均衡rebbon在order里面配置
1.会架设多个服务器service-member:8762
2.rebbon进行负载均衡,
3.order端当发送一个请求到rebbon,rebbon会获取到多个service-member:8762,
rebbon进行轮训到其中一个service-member:8762


1。order访问注册中心eureka 再访问到member
2。order用名称service-member访问注册中心eureka,
   eureka使用service-member映射到真实ip地址,ip交给order
3。order有了真实地址 从而访问到了member
====end spring Eureka注册中心


负载均衡 分别有: nginx 、Lvs、HAproxy、F5、SpringCloud也实现了负载均衡


接口网关springZuul :作用是拦截请求,类似nginx。
任何请求交给接口网关zuul,再由接口网关zuul转发给注册中心,类似nginx反向代理
使用项目名称区分接口网关 转发到实际地址,解决跨域问题。


搭建spring zuul接口网关项目:service-newzuul


<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!--lookup parent from repository-->
</parent>
<properties>
  <project.build.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>//web组建
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
  <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
application.yml
#eureka:instance:hostname:localhost //eureka接口名称
#eureka:client:registerWithEureka:false
#eureka:client:fetchRegistry:false
eureka:client:serviceUrl:defaultZone:http://localhost:8888/eureka/  //网关注册到注册中心的地址
server:port:8769 //zuul项目工程端口号8769
spring:application:name:service-zuul  //zuul注册名称
zuul:routes:api-a:path:/api-member/**   //只要api-member开头的url都跳转到service-member
zuul:routes:api-a:service-id:service-member
zuul:routes:api-b:path: /api-order/**
zuul:routes:api-a:service-id: service-order


@EnableZuulProxy  //开启网关
@EnableEurekaClient
@SpringBootApplication
public class AppZuull{
  public static void main(String[]args){
  SpringApplication.run(AppZuull.class,args);
  }
}
A、B 服务,怎么保证B服务只允许有A服务进行访问


----
分布式配置中心,搭建config_service环境
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!--lookup parent from repository-->
</parent>
<properties>
  <project.build.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
  <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


application.properties
spring.application.name=config-server
server.port=8889
spring.cloud.config.server.git.uri=https://gitee.com/itmayi/cfg2.git
spring.cloud.config.server.git.searchPaths=respo
spring.cloud.config.label=msater
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=


@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication{
public static void main(Sring [] args){
SpringApplication.run(ConfigServerApplication.class,args);
}
}
启动后访问地址: http://localhost:8889/foo/dev 


创建config client端项目:config-client


<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!--lookup parent from repository-->
</parent>
<properties>
  <project.build.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config</artifactId> //config server 是spring-cloud-config-server
</dependency> 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
  <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


bootstrap.properties
spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8889/
server.port=8881


@RestController
public class TestController{
@Value("${userName}") //将git中配置好的变量 注入到此 
private String userName;
@RequestMapping("/getUserName")
public String getUserName(){
return userName;
}
}
@SpringBootAppLication
public class NewClientApp{
public static void main(Sring []args){
SpringApplication.run(NewClientApp.class,args);
}
}  访问项目 http://127.0.0.1:8881/getUserName




客户端调用 rest ,feign(常用,自带负载均衡ribbon,自动开启 )
创建 feign项目 :
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
application.yml
eureka:client:serviceUrl:defaultZone:http://localhost:8888/eureka/
server:port:8765
server:tomcat:max-threads: 50 //tomcat最大支持50个线程 
spring:application:name:service-order-feign


@FeignClient(value="service-member")
public interface MemberFeign{
@RequestMapping("/getMemberAll")
public List getToOrderMemberAll();
}
@RestController
public class OrderFeginController{
@Autowired
private MemberFeign memberFeign;
@RequestMapping("/getToOrderMemberAll")
public List getToOrderMemberAll(){
System.out.println("order fegin 工程调用 member工程");
return memberFeign.getToOrderMemberAll();
}
}
@SpringBootApplication //注入到springboot管理 
@EnableEurekaClient //注册到 eureka
@EnableFeignClients //启动Feign客户端 
public class OrderFeign{
public static void main(Sting[] args){
SpringApplication.run.(OrderFeign.class,args);
}
}


服务的雪崩效应 hystrix,容断机制 、服务 降级、服务限流、解决服务雪崩效应
1.使用超时机制、服务降级(发生超时异常时,不去调用接口,调用本地fallback)
jMeter做压力测试 如:发送100个并发请求 。
产生服务堆积
2.容断机制,如果一个目标服务调用慢或者有大量超时 时,容断该服务的调用,对于后续调用请求不在调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则回复调用。
隔离机制 --例如对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型请求线程资源耗尽,则对后续的该类请求直接返回,例如将服务拆开,对于重要的服务使用单独服务器部署。
限流机制--主要是提前对各个类型的请求设置最高的QPS阀值 访问次数,若高于阀值则对该请求直接返回,不再调用后续资源,这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然可能造成雪崩效应。上面的容断机制、隔离机制都属于出错后的容错处理机制,而限流模式则为预防模式。
    限流机制 使用nginx实现,使用网关zuul实现


springCloud hystrix断路器
使用原有项目:order-fgin
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
application.yml
feign:hystrix:enabled: true //开启hystrix
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 4000  //接口超时时间4秒 ,微服务一般是10秒 或5秒


@FeignClient(value="service-member", fallback=MemberFallBack.class) //连接超时、报错,都会访问MemberFallBack
public interface MemberFeign{
@RequestMapping("/getMemberAll")
public List getToOrderMemberAll();
}
@Component
public class MemberFallBack implements MemberFeign{
public List getToOrderMemberAll(){
//服务的降级处理
List list = new ArrayList();
list.add("服务发生异常。。");
return list;
}
}


@SpringBootApplication //注入到springboot管理 
@EnableEurekaClient //注册到 eureka
@EnableFeignClients //启动Feign客户端 
public class OrderFeign{
public static void main(Sting[] args){
SpringApplication.run.(OrderFeign.class,args);
}
}

猜你喜欢

转载自blog.csdn.net/willplay9/article/details/80663556
今日推荐