It is always recommended to use Spring properties with Mule, to externalize any configuration parameters (URLs, ports, user names, passwords, etc.). For example, the Acme APIfrom my previous post connects to an external database. So instead of hard-coding connectivity options inside my application code, I would create a properties file, e.g.
acme.properties, as follows:
acme.jdbc.host=acmedb acme.jdbc.port=3306 acme.jdbc.database=acmeProducts acme.jdbc.user=WileECoyote acme.jdbc.password=GeeWhizz
Obviously, as a developer, I would use a test instance of Acme database to test my application. I’d commit the code to the version control system, including the properties file. Then my application would begin its journey from the automated build system to the Dev environment, to QA, Pre-Prod, and finally Prod – and fail to deploy on production because it wouldn’t be able to connect to the test database! Or even worse, it would connect to the test database and use it and no one would notice the problem until customers placed $0 order for an Acme widget which would normally cost $1000, all because the test database didn’t contain actual prices!
Sure, I could just follow the recommendations on our web site and create multiple sets of properties, e.g.
acme.dev.properties, acme.qa.properties, acme.prod.properties etc. But instead of solving the problem, it would create a few new ones.
- First, those properties must still be packaged within the application. Needless to say, IT guys would never give me the credentials for the production database, so I’d have to provide instructions for them on how to modify the properties file AFTER the application is deployed on the prod platform.
- Second, if (or rather WHEN) any of those properties will need to be changed (for example, the production DB is migrated to a new server), the whole process has to be repeated. And don’t forget about passwords and other sensitive data that should never appear in the code as open text and have to be encrypted.
It seems like every single customer I’ve worked with has this problem. And there was no convincing solution until one of our customers told me about an application called Zuul.
As the description on the Zuul web site says, “Zuul is a free, open source web application which can be used to centralize and manage configuration for your internal applications. It enables your operations team to control changes and your developers a centralized place to organize settings.” Of course, I couldn’t resist the urge to download it and try it out with Mule.
The installation and configuration of the Zuul server was pretty straightforward. After all, Zuul is a standard web application, so I just deployed it to my local Tomcat instance, alongside with MMC which was already deployed on it. I configured the database settings to point to my local MySQL instance. For the LDAP server I used OpenLDAP. I had to download and install the Unlimited Strength JCE Policy Files. Then I started Tomcat and opened the Zuul URL in my browser and logged in as administrator.
The first task is to create my environments. Navigating to
Administration->Environments menu, I see three environments,
dev, which Zuul creates by default. Just what I need! Moreover, the
prod environment is red – which means, only someone with Administrator privileges can mess with it.
And while we are in the
Administration screen, let’s create a new encryption key for our password values.
Administration->Key Management, then click on
Create New... button and populate the form:
And now we can create our properties. Select
Settings->Create New, give it a name, e.g.
AcmeProperties. On the next screen, you’re given the option to create a new properties set from scratch, or to upload an existing properties file. Since we already have
acme.properties for our
dev environment, let’s just use it. Select
dev environment on the left tab, then click
Upload File button:
Upload acme.properties and you’ll see the following screen:
Now we can encrypt the database password. Just make sure the correct key is selected, then click
Edit and select
To finish the server setup, we replicate this set of properties on the qa and prod environments. Select
qa tab, then click
Copy Existing, then in the
Search text box type
dev. Your properties set
"/dev/AcmeProperties.properties" will be highlighted. Click
Copy button and now you have the identical set of properties in
qa. Repeat the process for the
prod environment. Change properties values on each environment accordingly.
This concludes the server setup procedure. In the next post, I will show you how to configure Mule to use Zuul properties management.
UPDATE: Zuul can be downloaded at http://www.devnull.org/zuul