您的位置:首页 > 编程语言 > Java开发

springCloud微服务学习总结

2016-11-02 15:54 225 查看

SpingCloud微服务学习总结

首先springCloud是基于springboot来构建的,应该先了解springboot的特征。

eureka用来管理服务register与discovery,构建microService比较简单,只需要@EnableEurekaServer,@EnableEurekaClient两注解。

spingCloud的熔断机制Circuit。

统一的服务实例监控软件,@EnableHystrixDashboard

服务client的负载均衡Ribbon,RestTemplate底层通过Ribbon来实现load balance的访问server。

Zookeeper在springCloud中集成,通过apache Curator的开源client,Zookeeper能支持服务注册与发现。但我只使用zookeeper的分布式configuration。

7.我的springCloud 代码工程例子:https://git.oschina.net/andrexu2015/mindSpringCloudMicroDemo,欢迎下载。

### 1. spingBoot简单介绍

package com.calm.b;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan("com.calm.*")
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ImportResource(value = {"applicationContext.xml"})
@EnableAspectJAutoProxy
public class BizApplication {

/**
* 程序的启动入口
*
* @param args
*/
public static void main(String[] args) {
// SpringApplication.run(BizApplication.class, args);
new SpringApplicationBuilder(BizApplication.class).web(true).run(args);
}
}


构建spingboot工程,只需要在所有package目录最根层建立一个main方法class,配上@Configuration,@ComponentScan,@EnableAutoConfiguration注解就能够启动springBoot程序,@SpringBootApplication是前三个注解默认配置的。

1. @Configuration 代表该component是一个spring容器定义的配置bean。

2. @ComponentScan 代表spring容器需要扫表java组件包路径范围。默认是当前class所有在包位置。

3. @EnableAutoConfiguration 启动自动获取配置的开关,exclude是指可以在排除需要的configuration bean。

2. eureka的discovery与register

@EnableEurekaServer 代表服务管理的服务方,在main class上添加注册,参考例子cloud-eureka-server。

它提供管理界面,http://localhost:8761/

@EnableEurekaClient 客户端则使用这个注解,参考例子cloud-simple-service。

server与client 的bootstrap.properties配置如下:

#service discovery url
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/


eureka客户端与服务端之间交互应该知道其原理,EurekaClient 类是其主要组件,可以获取server端的所有注册信息,例子代码:

@RequestMapping(value = "/monitor")
public void getDishSetmealGroup(HttpServletRequest request, HttpServletResponse response)
throws ServletRequestBindingException {
InstanceInfo instanceInfo = discoveryClient.getNextServerFromEureka("cloudSimpleService", false);
System.out.println(instanceInfo.getHealthCheckUrl());
serviceUrl();
}

public String serviceUrl() {
// discoveryClient.geti
List<InstanceInfo> list = discoveryClient.getInstancesById("my-THINK:cloudSimpleService:8082");
if (list != null && list.size() > 0) {
System.out.println(list.get(0).getHomePageUrl());
}
Application application = discoveryClient.getApplication("cloudSimpleService");
list = application.getInstances();
if (list != null && list.size() > 0) {
System.out.println(list.get(0).getHealthCheckUrl());
}
return null;
}


通过eureka服务端可以,http://localhost:8761/eureka/apps可以查看一个xml结构式所有注册信息

<instanceId>my-THINK:cloudSimpleService:8082</instanceId>
<hostName>my-THINK</hostName>
<app>CLOUDSIMPLESERVICE</app>
<ipAddr>192.168.7.197</ipAddr>
<status>UP</status>
<overriddenstatus>UNKNOWN</overriddenstatus>
<port enabled="true">8082</port>
<securePort enabled="false">443</securePort>
<countryId>1</countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>


7.参考如下http://www.tuicool.com/articles/JBbU3mY ,描述EurekaClient的注册过程。

3. Circuit熔断器例子

参考spring 官方文档

4. HystrixDashboard使用介绍

参考spring 官方文档

5. Ribbon负载均衡的例子

我们通过RestTemplate来构建负载均衡,@LoadBalanced 标志

@Configuration
public class BeanConfiguration {

@LoadBalanced
@Bean
//  @Order()
public RestTemplate restTemplate(){
return new  RestTemplate();
}
}


@Service("usserService")
public class UserService {

@Resource
private RestTemplate restTemplate;

private static final Logger logger = LoggerFactory.getLogger(UserService.class);

final String SERVICE_NAME = "cloudSimpleService";

//  @HystrixCommand(fallbackMethod = "fallbackSearchAll")
public List<User>  searchAll() {
logger.info("====================================");
List<User> users=null;
try{
users=restTemplate.getForObject("http://" + SERVICE_NAME + "/user", List.class);
}catch(Exception e){
e.printStackTrace();
}
logger.info("====================================");
return users;
}

public List<User>  searchAllTwo() {
logger.info("====================================");
List<User> users=null;
try{
users=restTemplate.postForObject("http://" + SERVICE_NAME + "/user",null, List.class);
//restTemplate.exchange(url, method, requestEntity, responseType)
//restTemplate.delete(url);
}catch(Exception e){
e.printStackTrace();
}
logger.info("====================================");
return users;
}


主要通spring.application.name=cloudSimpleService 名字+url来访问具体的服务。

6. zookeeper分布式配置信息集成。

这个只介绍zookeeper与springCloud集成的分布式配置。

分两种配置基于服务实例之上的全局配置,基于服务的自己配置。

基于zookeeper,zkui服务的的配置结构如下:





要注意zkui配置文件node结构,

dev –代表自己的环境

– apps:customized – 所有appInstance配置

– cloudSimpleService –测试的服务应用

— —该app自己的属性定义

#App Config Dashboard (ACD) dump created on :Wed Nov 02 15:09:00 CST 2016
/configurations/mind/dev/apps=foo=bar
/configurations/mind/dev/apps:customized=foo=bar
/configurations/mind/dev/apps:customized/customized=age=22222222222
/configurations/mind/dev/apps:customized/customized=foo=bar
/configurations/mind/dev/cloudSimpleService=foo=bar
/configurations/mind/dev/cloudSimpleService/customized=foo=bar
/configurations/mind/dev/cloudSimpleService/customized=password=1wswddewwpassword
/configurations/mind/dev/cloudSimpleService/customized=userName=user12345andrex
/configurations/mind/dev/cloudSimpleService/mysqldb=foo=bar
/configurations/mind/dev/tradeAnalyzer=andrexu2=11
/configurations/mind/dev/tradeAnalyzer=foo=bar
/configurations/mind/dev/tradeAnalyzer=testUserNode=12433


服务端的配置如下:

#service name
spring.application.name=cloudSimpleService

spring.profiles.active=dev,datasource,mail,customized
# zookeeper所有集群address
spring.cloud.zookeeper.connectString=testzk1.shishike.com:2181,testzk2.shishike.com:2181,testzk3.shishike.com:2181
#是否开启zookeeper使用
spring.cloud.zookeeper.config.enable=true
#zokkeeper配置的根目录
spring.cloud.zookeeper.config.root=/configurations/mind/dev
spring.cloud.zookeeper.config.defaultContext=apps
spring.cloud.zookeeper.config.profileSeparator=:


使用springBoot配置与bean映射功能,测试get属性是否能获取zookeeper配置的值。

@Component
@ConfigurationProperties(prefix="customized")
public class CustomizedProperties {
//@NotNull
private String userName;
//@NotNull
private String password;

private String age;

public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐