当涉及到基于JVM的应用程序时,Hazelcast是一个很好的缓存工具。 如果您使用Amazon Web Services,则Hazelcast可以完美集成。
第一项任务是创建负责描述实例的策略。 我们将此策略命名为describe-instances-policy。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1467219263000",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances"
],
"Resource": [
"*"
]
}
]
}
必须访问亚马逊资源的应用程序应该使用用户或具有对我们需要的资源附加策略的角色。 在应用程序中使用亚马逊用户是一个坏习惯,这成为管理密钥的麻烦,更不用说安全性问题了。 因此,我们将重点介绍使用IAM角色进行的hazelcast配置。
我们的角色将称为my-ec2-role,并将附加政策describe-instances-policy。
通过这样做,具有hazelcast的ec2实例将能够检索其他ec2实例的私有ip,因此将尝试确定哪些实例有资格建立分布式缓存。
现在,我们可以进行hazelcast配置。 我们可以基于Java的配置或基于xml的配置。
让我们从xml配置开始。
<hazelcast
xsi:schemaLocation="https://hazelcast.com/schema/config https://hazelcast.com/schema/config/hazelcast-config-3.7.xsd"
xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<group>
<field>ec2-group</field>
<password>ec2-password</password>
</group>
<network>
<join>
<multicast enabled="false">
</multicast>
<tcp-ip enabled="false">
</tcp-ip>
<aws enabled="true">
<!--optional, default is us-east-1 -->
<region>eu-west-1</region>
<iam-role>my-ec2-role</iam-role>
<!-- optional, only instances belonging to this group will be discovered, default will try all running instances -->
<security-group-field></security-group-field>
<tag-key></tag-key>
<tag-value></tag-value>
</aws>
</join>
</network>
</hazelcast>
和主类一起加载xml文件。
package com.gkatzioura.hazelcastec2;
import com.hazelcast.config.*;
import com.hazelcast.core.Hazelcast;
/**
* Created by gkatzioura on 7/26/16.
*/
public class HazelCastXMLExample {
public static void main(String args[]) {
Config config = new ClasspathXmlConfig("hazelcast.xml");
Hazelcast.newHazelcastInstance(config);
}
}
要特别注意应禁用多播和tcp-ip。 由于我们指定了IAM角色,因此无需提供凭据。 Tag-key和Tag-value表示可以在ec2机器上添加的标签。 如果您指定标签键和值,则仅在具有相同标签和值的机器上建立连接。
您可以将安全组字段为空。 Hazelcast使用此信息进行实例筛选,但是您必须确保ec2实例使用的安全组具有打开的入站和出站流量端口5701、5702和5703。
Java配置遵循相同的规则。
package com.gkatzioura.hazelcastec2;
import com.hazelcast.aws.AWSClient;
import com.hazelcast.config.AwsConfig;
import com.hazelcast.config.Config;
import com.hazelcast.config.GroupConfig;
import com.hazelcast.config.JoinConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
/**
* Created by gkatzioura on 7/25/16.
*/
public class HazelCastJavaExample {
public static void main(String args[]) {
Config config = new Config();
GroupConfig groupConfig = new GroupConfig();
groupConfig.setName("ec2-group");
groupConfig.setPassword("ec2-password");
config.setGroupConfig(groupConfig);
JoinConfig joinConfig = config.getNetworkConfig().getJoin();
joinConfig.getTcpIpConfig().setEnabled(false);
joinConfig.getMulticastConfig().setEnabled(false);
AwsConfig awsConfig = joinConfig.getAwsConfig();
awsConfig.setIamRole("my-ec2-role");
awsConfig.setEnabled(true);
awsConfig.setRegion("eu-west-1");
Hazelcast.newHazelcastInstance(config);
}
}
将您的hazelcast应用上传到ec2并运行它们后,您会看到以下日志
Jul 26, 2016 6:34:50 PM com.hazelcast.cluster.ClusterService
INFO: [172.31.33.104]:5701 [dev] [3.5.4]
Members [2] {
Member [172.31.33.104]:5701 this
Member [172.31.41.154]:5701
}
我已经添加了gradle文件,以便使用xml或java配置进行一些快速测试。
group 'com.gkatzioura'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.5
repositories {
mavenCentral()
}
apply plugin: 'idea'
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile group: 'com.hazelcast', name:'hazelcast-cloud', version:'3.5.4'
}
task javaConfJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.gkatzioura.hazelcastec2.HazelCastJavaExample'
}
baseName = project.name + '-jconf'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
task javaXMLJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.gkatzioura.hazelcastec2.HazelCastXMLExample'
}
baseName = project.name + '-xmlconf'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
您可以在github上找到源代码。
翻译自: https://www.javacodegeeks.com/2016/07/configure-hazelcast-ec2.html